【问题标题】:Generating header file with JNI using 'javah'使用“javah”使用 JNI 生成头文件
【发布时间】:2017-12-15 14:38:25
【问题描述】:

我正在尝试将 JNI 用于使用 OpenCV4Android 库的 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

感谢您的帮助。

【问题讨论】:

  • 我尝试按照该线程的建议进行操作,但出现错误。我应该在我的原始帖子中提到它,但我现在已经编辑了它。
  • 你试过javah -classpath c:\Users\Majid\Documents\OpenCV4Android\OpenCVLib2.4.8\bin\classes\org\opencv;c:\Users\Majid\Documents\OpenCV4Android\iCam\bin\classes\com\example\icam -jni -d jni/ com.example.icam.nativeRDE吗?或者也许(我没有准备好验证的环境),您可以使用正向(Unix 样式)斜杠 /。原因是 javah 不是 cygwin 可执行文件,因此它不理解 /cygdrive。您已经注意到在 Windows 中需要 ";" 分隔符,而不是 referenced topic 中的 ":"
  • 是的,但它仍然无法正常工作。我想我有一个解决方法,所以希望应该没问题。
  • 一般来说,您不需要javah 在Android 上构建和运行您的JNI 代码。

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


【解决方案1】:

Javah 采用完全限定的类名和类路径。 类名必须是完整的包名。
例如:fullPackageName.className

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

Javah -jni -classpathC:\ProjectName\srccom.abc.YourClassName

【讨论】:

    【解决方案2】:

    解决方案:使用 '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)
    

    使用上述命令详细信息的示例命令

       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

    【解决方案3】:

    您甚至可以非常简单地从 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. 在 Package Explorer 下的 01Java_HelloWorld > src 右击 com.lithiumhead.jni 并选择 New>Class
    11. 输入名称为 HelloWorld
    12. 点击完成
    13. 将以下代码粘贴到

    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 文件\Java\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. 从菜单中选择 Run>External Tools>1 javah - C Header and Stub 文件生成器(这将为 C 代码生成头文件 com_lithiumhead_jni_HelloWorld.h 放在 bin 文件夹下 01Java_HelloWorld Java 项目。)

    【讨论】:

      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多