TurnsCoffeeIntoScripts
TurnsCoffeeIntoScripts

Reputation: 3918

Generation of a c/c++ header with JNI

I'm trying to generate a C-header with "javah - jni " and the javah.exe returns an error I've never seen before. I'm using JNI because I'm using the NDK for C/C++ android development.

Here's the error message:

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)

Here's the Java file that I use with 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();
}

I've searched in the Bug Parade of sun but couldn't find anything useful.

EDIT :

This is my platform:

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)

I'm invoking javah like this : javah -jni NativeCaller.java I call it being in the .java folder.

I've tried to call it with full package name but it can't find the class.

Upvotes: 3

Views: 5217

Answers (1)

Aleks G
Aleks G

Reputation: 57326

How are you invoking javah? Make sure you call it with the fully-qualified class name including package name. For example, I just did the following, which worked perfectly fine (I'm on a mac working in the terminal). Also, what is your working platform/java implementation/version?

$ 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

My java version is:

$ 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)

Upvotes: 3

Related Questions