6

javah当我在 java 类中编译本机方法以生成 JNI 头文件时,我只是遇到了一个恼人的 jni 问题。

如果该类使用了 3rd-party 包,例如: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或者格式有问题?

真的很迷茫。请提供一些帮助,谢谢!

4

2 回答 2

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 位操作系统

于 2013-07-26T03:19:49.253 回答
1

我也遇到了同样的问题,花了我半天时间。我只是将DetectionBasedTracker.java复制到我的项目中。我使用Android Studio。当我使用ExternalTools>javah生成.h文件时,控制台打印找不到org.opencv.core .Mat.copy 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方法和导入你需要的包。

于 2016-06-24T08:48:29.283 回答