java - 使用 JNI 生成 c/c++ header

标签 java java-native-interface android-ndk

我试图用“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/

相关文章:

java - Java 8 Streams 是否与 .Net IEnumerable 相同?

c# - 在 Java 程序中调用 C# 方法

java - JNI、多线程和调用方法

android - 在android中生成核心转储

java - Android - JNI 问题

java - 如何在 java 中使用 compareTo 函数

java - 演示不正确发布的对象的问题

java - Tomcat session 未运行

java - Android System.loadLibrary 崩溃

通过 App Store 或 Google Play 下载 Android 应用程序时无法运行 - ANR