问题
I'm trying to use JNI for an Android application using the OpenCV4Android library. I can generate a header file without using the opencv library, but I get an error whenever the class imports anything. I assume it needs to link to the library, but I'm not sure how to do that? I'm using cygwin on a Windows 8.1 64 bit machine.
original output:
$ javah -jni -classpath ./bin/classes -d jni/ com.example.icam.nativeRDE
Error: Class org.opencv.core.Mat could not be found.
After following advice from: Android, generate jni Header Files with javah , show error that can't find org.opencv.core.Mat, I get the following output:
$ javah -classpath /cygdrive/c/Users/Majid/Documents/OpenCV4Android/OpenCVLib2.4.8/bin/classes/org/opencv/;/cygdrive/c/Users/Majid/Documents/OpenCV4Android/iCam/bin/classes/com/example/icam/ -jni -d jni/ com.example.icam.nativeRDE
Error: no classes specified
-bash: /cygdrive/c/Users/Majid/Documents/OpenCV4Android/iCam/bin/classes/com/example/icam/: is a directory
I've tried:
- removing '/' after icam
- adding nativeRDE after 'icam/'
- adding nativeRDE.class after 'icam/'
Thanks for any help.
回答1:
Javah takes a fully qualified class name, and classpath.
Class name must be with full package name.
Ex:fullPackageName.className
Class path is your src folder not bin folder
Your classpath must be c\Users\Majid\Documents\OpenCV4Android\iCam\src
Javah -jni -classpath
C:\ProjectName\src
com.abc.YourClassName
回答2:
Solution: Generating header file with JNI using 'javah'
***I am using Window 10 and Android Studio 2.1.2.***
Suppose APP (JNIP my app Name) location is
E:\test\JNIP and you wrote native methods in JniExample.java file
JDK Location is
C:\Program Files\Java\jdk1.8.0_51\bin>
JNI Folder Location is
E:\test\JNIP\app\src\main\JNI (where, you want to create header file)
Class Location is
E:\test\JNIP\app\build\intermediates\classes\debug\com\example\mpankaj\jnip\JniExample.java
Android.jar location is
C:/Users/mpankaj/AppData/Local/Android/Sdk/platforms/android-23/android.jar
First Build your project before running below command
Write Command on coommand prompt/Terminal for .h file creation
javah -d (JNI Folder Location) -classpath (JAR Locaion);(class Location)
Example Command using above details for Command
C:/Program Files/Java/jdk1.8.0_51/bin>javah -d E:/test/JNIP/app/src/main/JNI -classpath C:/Users/mpankaj/AppData/Local/Android/Sdk/platforms/android-23/android.jar;E:\test\JNIP\app\build\intermediates\classes\debug com.example.mpankaj.jnip.JniExample
After this you will get .h file like this com_example_mpankaj_jnip_JniExample.h
回答3:
You can even execute javah from eclipse with much simplicity. I tried these below steps and they are working I referred the below link for solution http://www.lithiumhead.com/notes/windows_jni
Step by Step Guide
- Start Eclipse. Preferably create a new workspace called WorkSpaceEclipseJNI
- From the menu select File>New>Java Project
- Enter Project Name as 01Java_HelloWorld
- Click Next >
- Click Finish
- In the Package Explorer expand 01Java_HelloWorld
- Right click src folder and select New>Package
- Enter Name as com.lithiumhead.jni
- Click Finish
- In the Package Explorer under 01Java_HelloWorld > src right click com.lithiumhead.jni and select New>Class
- Enter Name as HelloWorld
- Click Finish
- Paste the following code into
HelloWorld.java
package com.lithiumhead.jni;
class HelloWorld {
public native void sayHello();
static {
System.loadLibrary("HelloWorld");
}
public static void main(String[] args) {
HelloWorld h = new HelloWorld();
h.sayHello();
}
}
- From the menu select Run>External Tools>External Tools Configurations…
- Highlight Program in the list in the left pane
- Press the New button
- Enter Name as javah - C Header and Stub File Generator
- For the Location browse to locate javah.exe in the JDK installation folder (will be something like C:\Program Files\Java\jdk1.7.0\bin\javah.exe)
- Enter Working Directory as: ${project_loc}/bin/
- Enter Arguments as -jni ${java_type_name}
- Click Apply
- Switch to the Common tab
- Select the checkbox next to External Tools under Display in favourites menu
- Click Apply
- Click Close
- Deselect Build Automatically from Project Menu
- In the Package Explorer right click 01Java_HelloWorld and select Build Project
- In the Package Explorer highlight HelloWorld.java
- From the menu select Run>External Tools>1 javah - C Header and Stub File Generator (This will generate the header file for the C code com_lithiumhead_jni_HelloWorld.h placed in the bin folder of 01Java_HelloWorld Java Project.)
来源:https://stackoverflow.com/questions/21663423/generating-header-file-with-jni-using-javah