※ ChatGPTを利用し、要約された質問です(原文:JNIでロードするライブラリが見つからない)
JNIでロードするライブラリが見つからない
このQ&Aのポイント
JNIを使ってライブラリを呼び出す際に、ライブラリが見つからないエラーが出ています。
JavaのコードとCのコードを正しく設定してコンパイル・実行しているにも関わらず、ライブラリが見つからないエラーが発生しています。
LD_LIBRARY_PATHの環境変数を設定しても解決せず、HelloWorldJNIlibがjava.library.path内に存在しないため、ライブラリが見つからないというエラーメッセージが表示されています。
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]$
何を見直すべきかおわかりの方いらっしゃいませんでしょうか.
お礼
ご回答ありがとうございました. すみません,そのページを参考にしていたのに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