我试图用“javah - jni”生成一个 C 头文件,javah.exe 返回一个我以前从未见过的错误。我正在使用 JNI,因为我正在使用 NDK 进行 C/C++ android 开发。
这是错误信息:
An exception has occured in the compiler (1.7.0_01).
java.lang.ClassCastException:
com.sun.tools.javac.api.ClientCodeWrapper$WrappedJavaFileManager cannot be cast to
com.sun.tools.javac.file.JavacFileManager
at com.sun.tools.javac.main.Main.compile(Main.java:411)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:132)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:513)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:335)
at com.sun.tools.javah.Main.main(Main.java:46)
这是我使用 jni 的 Java 文件:
package AndroidTest.AccelerometerTest
public class NativeCaller{
final private static String LIB_NAME = "AccelerometerTest";
static
{
System.LoadLibrary( LIB_NAME );
}
public static native int TestMethod();
public static native float ComputePointPosition();
}
我在 sun 的 Bug Parade 中搜索过,但找不到任何有用的东西。
编辑:
这是我的平台:
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Client VM (build 21.1-b02, mixed mode, sharing)
我像这样调用 javah:javah -jni NativeCaller.java
我称之为在 .java 文件夹中。
我试图用完整的包名调用它,但找不到类。
最佳答案
你如何调用 javah
?确保使用包含包名的完全限定类名调用它。例如,我刚刚执行了以下操作,效果非常好(我在终端上工作的 Mac 上)。另外,您的工作平台/Java 实现/版本是什么?
$ mkdir jnitest
$ cd jnitest
$ mkdir AndroidTest
$ mkdir AndroidTest/AccelerometerTest
$ vim AndroidTest/AccelerometerTest/NativeCaller.java
[pasted your code into the file, fixing two typos]
[missing ';' and loadLibrary starting with lower-case 'l']
[saved the file and exited editor]
$ javac AndroidTest/AccelerometerTest/NativeCaller.java
$ javah -jni AndroidTest.AccelerometerTest.NativeCaller
$ ls
AndroidTest AndroidTest_AccelerometerTest_NativeCaller.h
我的java版本是:
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)
关于java - 使用 JNI 生成 c/c++ header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8066201/