2016-04-28 6 views
0

に私はこのトピックに関する同様の質問がある知っているが、答えのどれも私の問題を解決することができませんでした:エラーUbuntuでJNIを使​​用して:ます。java.lang.UnsatisfiedLinkErrorを:なし... java.library.pathに

私は私は、ヘッダファイルをコンパイルして生成するには、次の使用

class hjni { 

    static { 
     System.loadLibrary("hjni"); 
    } 

    private native void print(); 

    public static void main(String[] args) { 
     new hjni().print(); 
    } 
} 

:javaファイルを持っている

:ここ

javac hjni.java 
javah -jni hjni 

はC++ファイルであります

g++ -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux hjni.cpp -o hjni.so 

ファイルhjni.classhjni.h、およびhjni.soがすべて作成されます:

#include <jni.h> 
#include <stdio.h> 
#include "hjni.h" 

JNIEXPORT void JNICALL 
Java_hjni_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello World!\n"); 
    return; 
} 

は、私はC++ファイルをコンパイルします。

私はJavaファイルを実行します。ここでは

java -Djava.library.path=. hjni 

は私が取得エラーです:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hjni in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1889) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
    at java.lang.System.loadLibrary(System.java:1088) 
    at hjni.<clinit>(hjni.java:4) 

私はjava.library.pathをチェックするjava -XshowSettings:propertiesを使用します。

興味深いことに
java.library.path = /usr/java/packages/lib/amd64 
     /usr/lib/x86_64-linux-gnu/jni 
     /lib/x86_64-linux-gnu 
     /usr/lib/x86_64-linux-gnu 
     /usr/lib/jni 
     /lib 
     /usr/lib 

、フォルダ

ここ

cd /usr/java/packages/lib/amd64 
bash: cd: /usr/java/packages/lib/amd64: No such file or directory 

は私が共有ライブラリを見つけることができる(libjli.so):

/usr/java/packages/lib/amd64 

は存在しません

/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli 

私は

export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli 

で上記のパスを追加するとき端末が開いている限り、パスは正常に追加されます。端末を閉じてもう一度開くと、追加されたパスはもう存在しません。私もhjni.sojliフォルダにコピーしましたが、同じリンクエラーが発生しました。

答えて

1

System.loadLibrary("hjni") Javaを実行すると、libhjni.soというファイルが検索されます。 System.mapLibraryName(libname)を呼び出して、指定されたlibのファイル名を調べます。残念なことに、mapLibraryNameのJavadocは、この名前がプラットフォームに依存する名前にマップされるだけで、このファイル名をビルドするためのルールは何であると述べていません。 Windowsの場合は<name>.dll、Linuxの場合はlib<name>.so、Mac OS Xの場合はlib<name>.jnilibですが、その時点での参照は見つかりません。

ファイルの名前を変更すると、すべて動作します。