8

我要做的就是使用 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”,我上面的类路径是正确的。我应该在我的命令窗口中写什么?

4

3 回答 3

18

更新 java >= Java9

由于Java9该命令javah已被标记为 adeprecation warning并且从Java10它开始,它已从 JDK 中删除,因为它的功能现在包含在javac命令中。

所以为了从 Java9 做同样的事情,你应该运行: javac -h . NativeLib.java

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

除了命令之外的主要区别在于,现在 JNI 标头的创建针对的是.java文件中的源代码,而不是已编译的.class

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

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

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

于 2018-01-08T11:10:26.110 回答
13

试试这个:

  1. 首先建立你的课程
  2. 将目录更改为\NDKTest\bin\classes\
  3. javah ddg.ndkTest.NativeLib
于 2012-07-03T14:30:04.530 回答
1

javah 正在寻找NativeLib.class,而不是源代码。所以你应该把它指向你编译的类在哪里,无论它在哪里。即使不在NDKTest/Bin/Classes您显然期望的地方。

于 2012-07-03T20:33:02.587 回答