17

Eclipse と gcc (フレーバーがある場合は Ubuntu の標準的なもの) を使用して、Ubuntu 8.10 で JNI を使用したいと考えています。

make ファイルがライブラリを正常に作成しているにもかかわらず、ライブラリをロードできないようです。

主な Java クラスは次のとおりです。

class Hello {
    public native void sayHello();

    static {
        System.loadLibrary("hello.so");
    }

    public static void main(String[] args) {
        Hello h = new Hello();
        h.sayHello();
    }
}

私のメイクファイルはそのままです。

    all : hello.so

hello.so : Hello.o
    gcc -shared -o hello.so Hello.o

Hello.o : Hello.c Hello.h
    gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -c Hello.c -o Hello.o

Hello.h : Hello.class
    javah -jni Hello

clean :
    -del Hello.h
    -del Hello.o

コードの残りの部分 (Hello.c) は、人が考えているように見えます。

私が得ているエラーは次のとおりです。

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello.so in java.library.path

明示的なパスを使用する場合:

System.loadLibrary("/home/gavin/Work/workspace/JNI/hello.so");

その後、動作しますが、可能であれば明示的なパスを使用したくありません。

4

5 に答える 5

23

As per Pax you should set the library path to where ever Java should look for the library. Your library name should be libhello.so. The call to load the library should then be:

System.loadLibrary("hello");

Linux libraries are referenced by the convention libname.so and loaded based on the name. Here is a link about dynamic linking problems in Java from the SWIG documentation, although you are not using SWIG this section is still relevant.

于 2009-05-24T15:21:18.310 に答える
17

あなたはSystem.loadLibrary()間違って呼んでいます。このloadLibraryメソッドは、「hello」などのライブラリ名を受け取り、対応する共有オブジェクトをロードしようとします。Unix では「libhello.so」をロードしようとし、Windows では「hello.dll」をロードしようとします。ファイルが で見つかることが期待されjava.library.pathます。

おそらく呼び出すつもりのメソッドSystem.load()は、完全修飾ファイル名を取り、それをロードするものです。このメソッドはFile引数として取る必要がありますが、代わりに文字列を取ります。を使用する場合load、ローカルの命名規則を手動で処理する必要がありますが、設定に依存する必要はありませんjava.library.path

于 2009-05-24T11:19:59.827 に答える
6

以下をせよ:

  1. Java クラスを次のように変更します。

    class Hello {
    
        public native void sayHello();
    
        static {
            System.loadLibrary("hello");
        }
    
        public static void main(String[] args) {
            Hello h = new Hello();
            h.sayHello();
        }
    }
    
  2. hello.so の名前を libhello.so に変更: cp hello.so libhello.soまたはmv hello.so libhello.so

  3. 次のように実行します。java -Djava.library.path=/home/gavin/Work/workspace/JNI/ Hello

于 2010-07-26T16:53:33.717 に答える
5

そして、あなたは次のようなものでそれを実行していますか:

java -Djava.library.path=/home/gavin/Work/workspace/JNI Hello

共有オブジェクトがライブラリ パスあることを確認する必要があります。

于 2009-05-24T11:05:25.393 に答える