Android, сгенерируйте файлы заголовков jni с помощью javah, покажите ошибку, которая не может найти org.opencv.core.Mat

У меня просто есть раздражающая проблема с jni, когда я компилирую собственный метод в классе java с javah для создания файлов заголовков JNI.

Если класс использовал сторонний пакет, например: org.opencv.core.Mat, то javah покажет ошибку, которая не может найти класс org.opencv.core.Mat.

Пример кода OpenCV, как показано ниже:

package org.opencv.samples.fd;

import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;

public class DetectionBasedTracker
{
public DetectionBasedTracker(String cascadeName, int minFaceSize) {
    mNativeObj = nativeCreateObject(cascadeName, minFaceSize);
}

public void start() {
    nativeStart(mNativeObj);
}

public void stop() {
    nativeStop(mNativeObj);
}

public void setMinFaceSize(int size) {
    nativeSetFaceSize(mNativeObj, size);
}

public void detect(Mat imageGray, MatOfRect faces) {
    nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());
}

public void release() {
    nativeDestroyObject(mNativeObj);
    mNativeObj = 0;
}

private long mNativeObj = 0;

private static native long nativeCreateObject(String cascadeName, int minFaceSize);
private static native void nativeDestroyObject(long thiz);
private static native void nativeStart(long thiz);
private static native void nativeStop(long thiz);
private static native void nativeSetFaceSize(long thiz, int size);
private static native void nativeDetect(long thiz, long inputImage, long faces);
}

Сначала я использовал команду

javah -classpath bin/classes -bootclasspath (the directory of android.jar) -d jni (packageName + ClassName) , shows the error "can't find the org.opencv.core.Mat

Затем я изменил команду на

javah - classpath bin/classes - bootclasspath (the dir of android.jar) ; (the dir of the opencv lib jar)  -d jni ..." ", this time it shows error

Исключение

Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class
 name: E:\Computer_Language\Java\soft_android\OpenCV-2.4.3-rc-android-sdk\OpenCV
-2.4.3-rc-android-sdk\sdk\java\bin\opencv library - 2.4.3.jar
    at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:177)
    at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:68)
    at com.sun.tools.javah.JavahTask.run(JavahTask.java:509)
    at com.sun.tools.javah.JavahTask.run(JavahTask.java:335)
    at com.sun.tools.javah.Main.main(Main.java:46)

Я думаю, что добавление каталога opencv lib в -bootclasspath полезно и необходимо. Ошибка в том, что я только что добавил два пути в -bootclasspath или формат что-то не так?

Действительно запутался. Пожалуйста, помогите, спасибо!


person santi    schedule 18.11.2012    source источник
comment
Будет ли проблемой создать голый класс NativeWrapper без какого-либо внешнего импорта и переместить туда все нативные методы? Они у вас уже есть static native, поэтому нужно просто добавить к существующим нативным вызовам NativeWrapper.   -  person Pavel Zdenek    schedule 18.11.2012
comment
@PavelZdenek NativeWrapper ? Я просто пытаюсь использовать javah для создания файла заголовка C собственного метода в коде Android. Я пробовал ситуацию, когда класс Android содержит собственный метод без использования opencv, и он работает. Когда класс содержит библиотеку opencv, javah показывает ошибку, как упоминалось в вопросе. Есть ли простой способ создать файл .h? как я могу каждый раз писать bootclasspath? Благодарю.   -  person santi    schedule 19.11.2012
comment
Я пробовал ситуацию, когда класс android содержит нативный метод без использования opencv, и это работает. Так почему бы вам не сделать это таким образом?   -  person Pavel Zdenek    schedule 19.11.2012
comment
@PavelZdenek, ты прав, я пробовал это раньше, это работает. Но проблема в том, что при использовании класса opencv в классе java содержится собственный метод, как показано в приведенном выше примере. Выдает ошибку!   -  person santi    schedule 19.11.2012
comment
Пожалуйста, используйте; вместо этого: ответ выше в окнах: javah -classpath /home/zijun/Dev/adt/OpencvAndroid/sdk/java/bin/classes;/home/zijun/workspace/LocTM/bin/classes -jni com.brainport.loctm. Соответствие   -  person Saber Solooki    schedule 02.09.2013


Ответы (2)


Вот что я сделал:

1.Откройте командную строку, введите (проект)/bin/classes: 2.type: javah -classpath (путь opencv4android sdk)/java/bin/classes: (местоположение вашего проекта)/bin/classes -jni (ваш java class файл, содержащий собственные интерфейсы библиотеки)

В моем проекте. Я сделал:

javah -classpath /home/zijun/Dev/adt/OpencvAndroid/sdk/java/bin/classes:/home/zijun/workspace/LocTM/bin/classes -jni com.brainport.loctm.TMatching

Это работает на Linux Ubuntu 12.04.02 64-битной ОС

person ZijunLost    schedule 26.07.2013

Я тоже столкнулся с той же проблемой, это стоило мне полдня. Я просто копирую DetectionBasedTracker.java в свой проект. Я использую Android Studio. Когда я использую ExternalTools> javah для создания файлов .h, консольная печать не может найти org.opencv.core .Mat.copying mat.java и matofRect.java в каталог DetectionBasedTracker.java существует только потому, что больше java-класса не может быть найдено. наконец, я считаю, что эта проблема была вызвана предложением import * в java-файле. и мы редко используем java-класс в нативном методе, который мы определили, я вырезал этот java-метод и получил это:

package cn.ntu.tonguefur.nativemethod;
public class DetectionBasedTracker{
private static native long nativeCreateObject(String cascadeName,int minFaceSize);
//Other native methods
private static native void nativeDetect(long thiz,long inputImage,long faces);
}

Теперь вы можете свободно использовать команду javah для создания файла .h. После этого добавьте методы java и импортируйте нужные вам пакеты.

person 何德福    schedule 24.06.2016