Генерация заголовка c / c ++ с использованием JNI - PullRequest
3 голосов
/ 09 ноября 2011

Я пытаюсь сгенерировать C-заголовок с помощью "javah - jni", и 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)

Вот файл Java, который я использую с jni:

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();
}

Я искал на Параде Жуков Солнца, но не смог найти ничего полезного.

РЕДАКТИРОВАТЬ:

Это моя платформа:

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.

Я пытался вызвать его с полным именем пакета, но он не может найти класс.

1 Ответ

4 голосов
/ 09 ноября 2011

Как вы вызываете 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)
...