我想做的就是使用 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”,并且我上面的类路径是正确的。我应该在命令窗口中写什么?
自从
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
试试这个:
\NDKTest\bin\classes\
javah ddg.ndkTest.NativeLib
javah 正在寻找
NativeLib.class
,而不是源代码。所以你应该将它指向你编译的类所在的位置,无论它在哪里。即使不在您明显期望的NDKTest/Bin/Classes
中。
@rakwaht 和@Sergey naswers 我很好。
javac -h . -cp ".;lib/*" MyCppNI.java
另外我还面临: