Generating header file with JNI using 'javah'

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.

Answers


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


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


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

  1. Start Eclipse. Preferably create a new workspace called WorkSpaceEclipseJNI
  2. From the menu select File>New>Java Project
  3. Enter Project Name as 01Java_HelloWorld
  4. Click Next >
  5. Click Finish
  6. In the Package Explorer expand 01Java_HelloWorld
  7. Right click src folder and select New>Package
  8. Enter Name as com.lithiumhead.jni
  9. Click Finish
  10. In the Package Explorer under 01Java_HelloWorld > src right click com.lithiumhead.jni and select New>Class
  11. Enter Name as HelloWorld
  12. Click Finish
  13. 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();
}

}

  1. From the menu select Run>External Tools>External Tools Configurations…
  2. Highlight Program in the list in the left pane
  3. Press the New button
  4. Enter Name as javah - C Header and Stub File Generator
  5. 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)
  6. Enter Working Directory as: ${project_loc}/bin/
  7. Enter Arguments as -jni ${java_type_name}
  8. Click Apply
  9. Switch to the Common tab
  10. Select the checkbox next to External Tools under Display in favourites menu
  11. Click Apply
  12. Click Close
  13. Deselect Build Automatically from Project Menu
  14. In the Package Explorer right click 01Java_HelloWorld and select Build Project
  15. In the Package Explorer highlight HelloWorld.java
  16. 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.)

Need Your Help

How to make CSS triangles (with borders) compatible across browsers

css cross-browser flowchart

I was able to create a neat pointy flow-chart, as shown here: http://jsfiddle.net/R8Gx3/3/

Can't get FormsAuthentication to properly work with WCF

asp.net wcf forms-authentication .aspxauth

I have both the wcf and asp.net project together in the same project. (I'm running on Azure, so this is more convenient).