Android,用javah生成jni头文件,显示可以';找不到org.opencv.core.Mat

Android,用javah生成jni头文件,显示可以';找不到org.opencv.core.Mat,android,opencv,java-native-interface,javah,Android,Opencv,Java Native Interface,Javah,当我用javah在java类中编译本机方法以生成jni头文件时,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 DetectionBa

当我用
javah
在java类中编译本机方法以生成jni头文件时,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)
我认为,在
-bootclasspath
中添加opencv库的目录是有用和必要的。错误是因为我刚刚在
-bootclasspath
中添加了两个路径,或者格式有问题

真的很困惑。 请给我一些帮助,谢谢

我就是这么做的:

1.打开命令行,键入(项目)/bin/classes: 2.type:javah-classpath(opencv4android-sdk-path)/java/bin/classes:(您的项目位置)/bin/classes-jni(包含本机库接口的java类文件)

在我的项目中。我做到了:

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


在Linux Ubuntu12.04.02 64位操作系统上运行时,我也遇到了同样的问题,花费了我半天的时间。我只是将DetectionBasedTracker.java复制到我的项目中。我使用Android Studio。当我使用ExternalTools>javah生成.h文件时,控制台打印找不到org.opencv.core.Mat.copying Mat.java&matofRect.java到目录DetectionBasedTracker.java存在只是因为找不到更多的java类。最后,我发现这个问题是由java文件中的import*子句引起的。我们很少在我们定义的本机方法中使用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方法并导入所需的包。

在没有任何外部导入的情况下创建基本的
NativeWrapper
类并将所有本机方法移到那里会有问题吗?您已经有了它们
static native
,因此只需使用
NativeWrapper来预先处理现有的本机调用即可。
@PavelZdenek NativeWrapper?我只是尝试使用javah在android代码中生成本机方法的C头文件。我曾经尝试过android类包含本机方法而不使用opencv的情况,它可以工作。当类包含opencv库时,javah会显示错误,正如前面提到的问题。有没有一种简单的方法来生成.h文件?我怎么能每次都写bootclasspath呢?谢谢。“我已经尝试过android类包含本机方法而不使用opencv的情况,它是有效的。”那么你为什么不这样做呢?@PavelZdenek你是对的,我以前试过,它是有效的。但问题是,当在java类中使用opencv类时,它包含本机方法,正如上面的示例所示。它出错了!请在windows中使用“;”代替“:”:javah-classpath/home/zijun/Dev/adt/OpencvAndroid/sdk/java/bin/classes/home/zijun/workspace/LocTM/bin/classes-jni-com.brainport.LocTM.tmatch