Android,用javah生成jni头文件,显示无法找到的错误org.opencv.core.Mat

时间:2012-11-18 07:42:03

标签: 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 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中添加了两个路径,或者格式错误了?

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

2 个答案:

答案 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方法并导入所需的包。