使用'javah'使用JNI生成头文件

时间:2014-02-09 18:55:46

标签: java android opencv java-native-interface javah

我正在尝试使用OpenCV4Android库将JNI用于Android应用程序。我可以在不使用opencv库的情况下生成头文件,但每当类导入任何内容时我都会收到错误。我认为它需要链接到库,但我不知道该怎么做?我在Windows 8.1 64位机器上使用cygwin。

原始输出:

$ javah -jni -classpath ./bin/classes -d jni/ com.example.icam.nativeRDE  
Error: Class org.opencv.core.Mat could not be found.

按照以下建议:Android, generate jni Header Files with javah , show error that can't find org.opencv.core.Mat后,我得到以下输出:

$ 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

我试过了:

  • 在icam
  • 之后删除'/'
  • 在'icam /'
  • 之后添加nativeRDE
  • 在'icam /'
  • 之后添加nativeRDE.class

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

Javah采用完全限定的类名和类路径。 班级名称必须包含完整的包裹名称 实施例:fullPackageName.className

类路径是你的src文件夹而不是bin文件夹 您的类路径必须是c\Users\Majid\Documents\OpenCV4Android\iCam\src

Javah -jni -classpath C:\ProjectName\src com.abc.YourClassName

答案 1 :(得分:4)

解决方案:使用'javah'

使用JNI生成头文件
         ***I am using Window 10 and Android Studio 2.1.2.***
  

假设APP( JNIP我的应用名称)位置为

      E:\test\JNIP and you wrote native methods in JniExample.java file

JDK位置

   C:\Program Files\Java\jdk1.8.0_51\bin> 

JNI文件夹位置

    E:\test\JNIP\app\src\main\JNI (where, you want to create header file)

班级位置

 E:\test\JNIP\app\build\intermediates\classes\debug\com\example\mpankaj\jnip\JniExample.java

Android.jar位置

C:/Users/mpankaj/AppData/Local/Android/Sdk/platforms/android-23/android.jar
  

首先在运行命令

之前构建项目

在命令提示符/终端上写入命令以创建.h文件

javah -d (JNI Folder Location) -classpath (JAR Locaion);(class Location)

示例命令使用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 
  

在此之后你会得到像这样的.h文件 com_example_mpankaj_jnip_JniExample.h

答案 2 :(得分:0)

你甚至可以简单地从eclipse执行javah。 我尝试了以下步骤并且他们正在工作我在下面的链接中提到了解决方案http://www.lithiumhead.com/notes/windows_jni

分步指南

  1. 启动Eclipse。最好创建一个名为的新工作区 WorkSpaceEclipseJNI
  2. 从菜单中选择文件>新建> Java项目
  3. 输入项目名称为01Java_HelloWorld
  4. 点击下一步>
  5. 点击完成
  6. 在Package Explorer中展开01Java_HelloWorld
  7. 右键单击src文件夹,然后选择New> Package
  8. 输入名称为com.lithiumhead.jni
  9. 点击完成
  10. 在01Java_HelloWorld>下的Package Explorer中src右键单击  com.lithiumhead.jni并选择New> Class
  11. 输入名称为HelloWorld
  12. 点击完成
  13. 将以下代码粘贴到
  14. 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. 从菜单中选择运行>外部工具>外部工具 配置...
    2. 在左侧窗格的列表中突出显示“程序”
    3. 按“新建”按钮
    4. 输入名称作为javah - C标头和存根文件生成器
    5. 对于位置浏览以在JDK安装中找到javah.exe 文件夹(将类似于C:\ Program 文件\爪哇\ jdk1.7.0 \ BIN \ javah.exe)
    6. 输入工作目录:$ {project_loc} / bin /
    7. 输入参数-jni $ {java_type_name}
    8. 点击“应用”
    9. 切换到“常用”标签
    10. 选中显示位置下的外部工具旁边的复选框  收藏菜单
    11. 点击“应用”
    12. 点击关闭
    13. 从项目菜单中自动取消选择构建
    14. 在Package Explorer中右键单击01Java_HelloWorld并选择  建设项目
    15. 在Package Explorer中突出显示HelloWorld.java
    16. 从菜单中选择运行>外部工具> 1 javah - C标题和存根  文件生成器(这将生成C代码的头文件  com_lithiumhead_jni_HelloWorld.h放在bin文件夹中  01Java_HelloWorld Java Project。)