プロが教える店舗&オフィスのセキュリティ対策術

JNIを使ってライブラリを呼び出すとき,
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path
というようにライブラリが見つからないエラーが出て困っています.

【Javaのコード】
[*****@**** jnitest]$ vi HelloWorldJNI.java
public class HelloWorldJNI {
static {
System.loadLibrary("HelloWorldJNIlib");
}
public native void sayHelloWorld();

public static void main(String[] args) {
HelloWorldJNI hello = new HelloWorldJNI();
hello.sayHelloWorld();
}
}

【Cのコード】
[*****@**** jnitest]$ vi HelloWorldJNI.c
#include "HelloWorldJNI.h"
JNIEXPORT void JNICALL
Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env,
jobject obj ) {
printf("Hello World");
}

【手順】
[*****@**** jnitest]$ javac HelloWorldJNI.java
[*****@**** jnitest]$ ls
HelloWorldJNI.c HelloWorldJNI.class HelloWorldJNI.java
[*****@**** jnitest]$ javah HelloWorldJNI
[*****@**** jnitest]$ ls
HelloWorldJNI.c HelloWorldJNI.class HelloWorldJNI.h HelloWorldJNI.java
[*****@**** jnitest]$ gcc -fPIC -shared -I/usr/lib/jvm/java-1.6.0/include/ -I/usr/
lib/jvm/java-1.6.0/include/linux/ HelloWorldJNI.c -o HelloWorldJNIlib.so
[*****@**** jnitest]$ ls
HelloWorldJNI.c HelloWorldJNI.h HelloWorldJNIlib.so
HelloWorldJNI.class HelloWorldJNI.java
[*****@**** jnitest]$ export LD_LIBRARY_PATH=.
[*****@**** jnitest]$ java HelloWorldJNI
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at HelloWorldJNI.<clinit>(HelloWorldJNI.java:3)
[*****@**** jnitest]$ java -Djava.library.path=. HelloWorldJNI
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at HelloWorldJNI.<clinit>(HelloWorldJNI.java:3)
[*****@**** jnitest]$


何を見直すべきかおわかりの方いらっしゃいませんでしょうか.

A 回答 (1件)

JNIは門外漢なのですが。



http://www.hellohiro.com/native.htm

↑のサイトを参照すると「Linuxの場合はダイナミックリンクライブラリのファイルの名前の先頭にlibとつけなければなりません。」

という記述があります。

[*****@**** jnitest]$ gcc -fPIC -shared -I/usr/lib/jvm/java-1.6.0/include/ -I/usr/
lib/jvm/java-1.6.0/include/linux/ HelloWorldJNI.c -o HelloWorldJNIlib.so

↑コマンドのHelloWorldJNIlib.soの部分をlibHelloWorldJNI.so

にしてみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました.
すみません,そのページを参考にしていたのにlibの件見落としていました...

ファイル名をlibで始まるように変更したところうまくいきました.
Javaで呼ぶ方では「lib」付けなくていいんですね.

[****@***** jnitest]$ vi HelloWorldJNI.java

public class HelloWorldJNI {
static {
System.loadLibrary("HelloWorldJNI");
}
public native void sayHelloWorld();

public static void main(String[] args) {
HelloWorldJNI hello = new HelloWorldJNI();
hello.sayHelloWorld();
}
}
[****@***** jnitest]$ gcc -fPIC -shared -I/usr/lib/jvm/java-1.6.0/include/ -I/usr/
lib/jvm/java-1.6.0/include/linux/ HelloWorldJNI.c -o libHelloWorldJNI.so
[****@***** jnitest]$ ls
HelloWorldJNI.c HelloWorldJNI.h libHelloWorldJNI.so
HelloWorldJNI.class HelloWorldJNI.java

お礼日時:2009/01/29 12:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!