当我使用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 lib目录是有用且必要的。错误是因为我刚刚在-bootclasspath
中添加了两个路径,或者格式错误了?
真的很困惑。 请给一些帮助,谢谢你!
答案 0 :(得分:6)
这就是我所做的:
1.打开命令行,键入(project)/ 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.TMatching
适用于Linux Ubuntu 12.04.02 64位操作系统
答案 1 :(得分:1)
我也遇到了同样的问题,它花了我半天。我只是将DetectionBasedTracker.java复制到我的poject.I使用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方法并导入所需的包。