7

HelloWorld.soというライブラリと、次のコンテンツを含むプログラムHelloWorld.javaがあります。

class HelloWorld {
     private native void print();
     public static void main(String[] args) {
         new HelloWorld().print();
     }
     static {
         System.loadLibrary("HelloWorld");
     }
 }

HelloWorld.javaを実行しようとすると、次のエラーが発生します。

$ /usr/java1.4/bin/java HelloWorld
スレッド「メイン」の例外
java.lang.UnsatisfiedLinkError:java.library.pathにHelloWorldがありません
        java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491)で
        java.lang.Runtime.loadLibrary0(Runtime.java:788)で
        java.lang.System.loadLibrary(System.java:834)で
        HelloWorldで。<clinit>(HelloWorld.java:7)

任意のヒント?

4

4 に答える 4

15

私はこの問題を抱えていて、ライブラリの名前をlibHelloWorld.soMichael Myersの提案に変更し、それに従うことで修正しました。私はArchLinux64ビットを使用しています。

HelloWorld.c

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

/* shamelessly stolen from the book 'The Java Native Interface: Programmer's
   Guide and Specification' */
JNIEXPORT void JNICALL
Java_HelloWorld_print (JNIEnv *env, jobject obj) {
    printf("Hello World!\n");
}

HelloWorld.java

class HelloWorld {
     private native void print();
     public static void main(String[] args) {
         new HelloWorld().print();
     }
     static {
         System.loadLibrary("HelloWorld");
     }
 }

構築とテスト:

$ javac HelloWorld.java
$ javah -classpath . HelloWorld
$ gcc -shared -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux HelloWorld.c -o libHelloWorld.so
$ java -classpath . -Djava.library.path=. HelloWorld
Hello World!

tl; dr:libライブラリのファイル名の先頭に配置

于 2013-07-09T22:08:38.907 に答える
13

このエラーが発生した場合、いくつかの点が役立つと思います。

  1. .cファイルと生成されたファイル( .h)の関数名の整合性を確認します
  2. OSに基づくjniライブラリの名前。例:HelloWorld.javaでは、System.loadLibrary("HelloWorld");
    • Solaris:libHelloWorld.so
    • Linux:libHelloWorld.so
    • 勝つ:HelloWorld.dll
    • マック:libHelloWorld.jnilib
  3. 実行時に、を追加し-Djava.library.path=PATHます。PATHjniライブラリを配置する場所に

これが私のリファレンスです:https ://blogs.oracle.com/moonocean/entry/a_simple_example_of_jni

于 2013-12-09T10:11:29.280 に答える
7

HelloWorld.soはどこにありますか?おそらく、コマンドラインパラメータを使用してその親ディレクトリを指定する必要があります"-Djava.library.path"

たとえば、にある場合は、を呼び出すときにオプションとして"/path/libs/HelloWorld.so"追加します。たとえば、それは私のプロジェクトの1つにあります。-Djava.library.path=/path/libsjava"-Djava.library.path=lib"

編集:LD_LIBRARY_PATH Dan Dyerは、環境変数もこれに使用できると指摘しています。

于 2009-04-17T18:29:43.570 に答える
2

@mmyersご返信ありがとうございます。System.loadLibraryをSystem.loadに変更し、引数としてフルパスとファイル名を渡すだけで、魅力のように機能することがわかりました。

その前でも、「-D」パラメータを使用してLD_LIBRARY_PATHを設定しようとしましたが、成功しませんでした。

フィギュアに行こう!:)

もう一度ありがとう、カレン

于 2009-04-20T16:26:02.360 に答える