私はC++からJavaで単純なネイティブメソッドを呼び出そうとしています。これを実現するには、次のようにします。
以下に示すような単純なクラスを作成します。
public class HelloNative{ public native void printString(String str); static{ System.out.println("Current Directory is: " + System.getProperty("user.dir")); System.load(System.getProperty("user.dir") + "/libhellonative.so"); } public static void main(String[] args){ System.out.println("Calling Native Libraray (libhellonative.so) method printString"); new HelloNative().printString("Message from Java to C"); } }
javah -jni
次の宣言を作成するために使用するネイティブメソッドの.hファイルを作成します。JNIEXPORT void JNICALL Java_HelloNative_printString(JNIEnv *, jobject, jstring);
.cpp
次のようにファイルにネイティブ関数を実装します。JNIEXPORT void JNICALL Java_HelloNative_printString(JNIEnv* jni_env, jobject java_obj, jstring msg){ printf("inside native method\n"); jboolean iscopy; const char *message = (jni_env)->GetStringUTFChars( msg, &iscopy); printf("%s", message); }
そして最後に、
.so
以下を使用してファイルを作成します。g++ HelloNative.cpp -o libhellonative.so -shared -Wl,-soname,libhellonative.so -static -lc -I /usr/lib/jvm/java-6-sun-1.6.0.26/include -I /usr/lib/jvm/java-6-sun-1.6.0.26/include/linux
しかし、.javaファイルをコンパイルして実行すると、ランタイム例外が発生します。
Current Directory is: /home/gmuhammad/Projects/test
Calling Native Libraray (libhellonative.so) method printString
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.printString(Ljava/lang/String;)V
at HelloNative.printString(Native Method)
at HelloNative.main(HelloNative.java:16)