【问题标题】:Generation of a c/c++ header with JNI使用 JNI 生成 c/c++ 标头
【发布时间】:2011-11-09 14:07:09
【问题描述】:

我正在尝试使用“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 文件夹中。

我尝试使用完整的包名调用它,但找不到类。

【问题讨论】:

    标签: java java-native-interface android-ndk


    【解决方案1】:

    你如何调用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)
    

    【讨论】:

    • 你是对的,我没有用整个包名调用,结果证明是我的错误。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2018-02-15
    • 2017-01-13
    • 2017-06-12
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多