生成 Java JNI 标头

问题描述 投票:0回答:4

我想做的就是使用 JDK Javah.exe 程序生成 JNI 头文件,但无论我尝试什么,我都会收到错误消息“错误:找不到 'ddg.ndkTest.NativeLib' 的类文件” (其中 ddg.ndkTest 是命名空间,NativeLib 是 java 类文件)。另外,请注意,为了进一步简化流程,我已将整个 Android 项目复制到 Java 目录中。

我尝试了以下命令,但没有一个起作用:

  • javah -jni ddg.ndkTest.NativeLib
  • javah -verbose -jni -classpath \NDKTest\bin\classes ddg.ndkTest.NativeLib
  • C:\Program Files\Java\jdk1.7.0_02\bin>javah.exe -jni -classpath \NDKTest\bin\classes\ ddg.ndkTest.NativeLib

如果我的包裹被叫; “ddg.ndkTest”,我的班级是; “NativeLib.java”,并且我上面的类路径是正确的。我应该在命令窗口中写什么?

java header java-native-interface
4个回答
25
投票

Java >= Java9 的更新

自从

Java9
命令
javah
被标记为
deprecation warning
以来,从
Java10
开始,它已从 JDK 中删除,因为它的功能现在包含在
javac
命令中。

因此,为了 从 Java9 执行相同的操作,您应该运行:

javac -h . NativeLib.java

注意我假设您位于正确的目录中

除了命令之外的主要区别在于,现在 JNI 标头创建的目标是

.java
文件中的源代码,而不是编译后的
.class

-h 目录 指定放置生成的本机头文件的位置。

指定此选项时,将为每个包含本机方法或具有使用 java.lang.annotation.Native 注释的一个或多个常量的类生成本机头文件。如果该类是包的一部分,则编译器会将本机头文件放入反映包名称的子目录中,并根据需要创建目录。

https://docs.oracle.com/en/java/javase/11/tools/javac.html#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9


14
投票

试试这个:

  1. 首先建立你的课程
  2. 将目录更改为
    \NDKTest\bin\classes\
  3. 奔跑
    javah ddg.ndkTest.NativeLib

1
投票

javah 正在寻找

NativeLib.class
,而不是源代码。所以你应该将它指向你编译的类所在的位置,无论它在哪里。即使不在您明显期望的
NDKTest/Bin/Classes
中。


0
投票

@rakwaht 和@Sergey naswers 我很好。

javac -h . -cp ".;lib/*" MyCppNI.java

另外我还面临:

  1. 列表项扩展名“.java”是必需的
  2. “-o”输出。选项不适用于 javac(但我将其用于 javah)
© www.soinside.com 2019 - 2024. All rights reserved.