1

私は、Koper (koper.googlecode.com) のフォークである Sumerian (github.com/ryanthejuggler/Sumerian) と呼ぶプログラムに取り組もうとしています。jar から Koper を実行すると、問題なく読み込まれ、プログラムを使用できます。私は少し改善して再コンパイルしましたが、今ではeinkfbライブラリが見つかりませんlibeinkfb.so. これを以下の出力の 2 行目にリストされている場所にコピーしましたが、プログラムは jar から実行した場合にのみ実行されます。

私のリファクタリングの一部は、すべてをパッケージに入れることでした。元のコードはフラットな構造でした。

また、JAR マニフェストも確認しました。これは非常に基本的なもので、バージョンとエントリ クラスのみを定義しています。

Java プログラムが参照できるようにするには、.so ファイルをどこに置く必要がありますか?

私のコードを実行しようとしています:

[root@(none) bin]# java com.ramuller.sumerian.Sumerian
/qte/lib:lib::/usr/java/packages/lib/arm:/lib:/usr/lib
construct EInkFB
java.lang.UnsatisfiedLinkError: com.ramuller.sumerian.display.eink.EInkFB.open(Ljava/lang/String;)Ljava/nio/ByteBuffer;
        at com.ramuller.sumerian.display.eink.EInkFB.open(Native Method)
        at com.ramuller.sumerian.display.eink.EInkFB.<init>(EInkFB.java:113)
        at com.ramuller.sumerian.Sumerian.main(Sumerian.java:72)
construct Display width=600 height=800Creating SwingDisplay...
Exception in thread "main" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)
        at java.awt.Window.<init>(Window.java:535)
        at java.awt.Frame.<init>(Frame.java:420)
        at javax.swing.JFrame.<init>(JFrame.java:224)
        at com.ramuller.sumerian.display.SwingDisplay.<init>(SwingDisplay.java:21)
        at com.ramuller.sumerian.Sumerian.main(Sumerian.java:90)

直後に .jar を実行、構成なし:

[root@(none) bin]# java -jar ../Koper.jar 
User directory: /mnt/sd/bin
/qte/lib:lib::/usr/java/packages/lib/arm:/lib:/usr/lib
construct EInkFB
The framebuffer device was opened successfully.
^C[root@(none) bin]# java -version
java version "1.7.0_06"
Java(TM) SE Runtime Environment (build 1.7.0_06-b24)
Java HotSpot(TM) Client VM (build 23.2-b09, mixed mode)

編集私は現在コードをロードしています:

System.loadLibrary("einkfb");
4

2 に答える 2

1

この行com.ramuller.sumerian.display.eink.EInkFB.open(Native Method)では、ネイティブメソッドを含むクラスのパッケージの名前を変更したと思いますが、これは正しいですか?

JNIでは、.soファイル内のメソッドの名前とネイティブJavaメソッドの名前が、メソッドのパッケージ名やクラス名を含めて完全に一致している必要があります。したがって、Javaはlibrayを見つけることができますが(そうでない場合は、ライブラリが見つからないという別のメッセージが表示されますeinkfb)、このライブラリ内のメソッドを見つけることができません。

クラスの名前を元に戻すか、ライブラリ内の関数の名前を変更する必要があります。そのため、クラスを再コンパイルする必要があります。

于 2012-12-09T20:19:07.673 に答える
0

いくつか検索した後、次を使用してライブラリを明示的にロードすることもできることがわかりました

System.loadLibrary("<name-of-lib>");

詳細については、このリンクを確認してください。同 に 関 する 記述UnsatisfiedLinkError。記載のリンクから

これの最も一般的な原因は、loadLibrary 関数に渡された名前のネイティブ ライブラリの名前が正しくないことです。loadLibrary 関数に渡される文字列には、文字列にファイル拡張子名 (.dll または .so) を含めないでください。文字列は、すべてのプラットフォームで libname ではなく name でなければなりません。Windows では、ネイティブ ライブラリは name.dll と呼ばれ、ほとんどの Unix システムでは libname.so と呼ばれる必要があります。

system.loadLibrary javadocも確認してください。


編集

java以下に示すように、実行コマンドを発行する際にライブラリ パスを指定することもできます。.soファイルをディレクトリに配置し、ここで参照します。

 java -Djava.library.path=. com.ramuller.sumerian.Sumerian
于 2012-12-09T18:21:31.033 に答える