0

誰かが私の問題を解決してくれることを願っています。もともと Windows 用に作成された JNI 用の C ラッパーを Linux でコンパイルしています ([こちら][1] で既に解決されている質問がありました)。私の現在の問題は次のとおりです。

コードは基本的にaaa.c、aaa.h、bbb.c、bbb.hで構成されています

aaa.h は、「javah」ツールによって生成されたヘッダーです。

aaa.c は aaa.h の実装です bbb.h と bbb.c にはいくつかの実装があります

aaa.c によって呼び出される関数。そのうちの 1 つは次のとおりです。

int jstring2char(JNIEnv*, jstring, char**);

今、Code::Blocks でプロジェクトを作成しました。プロジェクトがビルドされると、次のコマンドが実行されます。

gcc -Wall  -g -D_GNU_SOURCE -DUNIX    -I../somepath/Inc -I/usr/local/jdk1.7.0_40/include/linux -I/usr/local/jdk1.7.0_40/include  -c /somepath/Scr/aaa.c -o obj/Debug/aaa.o
gcc -Wall  -g -D_GNU_SOURCE -DUNIX    -I../somepath/Inc -I/usr/local/jdk1.7.0_40/include/linux -I/usr/local/jdk1.7.0_40/include  -c /somepath/Scr/bbb.c -o obj/Debug/bbb.o
g++ -shared  obj/Debug/aaa.o obj/Debug/bbb.o   -o bin/Debug/libWrapper.so  

プロセスは 0 エラー、0 警告で完了します。

次に、ライブラリを /opt/somepath にインストールしました。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/somepath

生成されたライブラリを読み込もうとすると

System.loadLibrary("libWrapper.so");

エラー:

スレッド「メイン」の例外 java.lang.UnsatisfiedLinkError: java.library.path に libWrapper.so がありません

生成されます。私の最初の推測では、満たされていない依存関係があるため、ldd を実行します。

root@Ubuntu10:/opt/somepath# ldd libWrapper.so
    linux-gate.so.1 =>  (0x00110000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00161000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00111000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00662000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00bae000)
    /lib/ld-linux.so.2 (0x00915000)

したがって、最初の問題は、「linux-gate.so.1」が問題の原因であるかどうかがわからないことです。

一方、より具体的なエラー メッセージがあるかどうかを確認するためだけに、jna API を使用してライブラリを読み込んでテストしました。

Native.loadLibrary("libWrapper.so", SClass.class);

実際、私は別のメッセージを受け取りました:

スレッド「メイン」の例外 java.lang.UnsatisfiedLinkError: ライブラリ 'libWrapper.so' をロードできません: libWrapper.so: 未定義のシンボル: jstring2char

jstring2char は bbb.h で宣言され、bbb.c で実装され、aaa.c によって呼び出される関数です。ビルド時に両方がリンクされていたにもかかわらず、aaa.c が bbb.c 関数を解決していないようです。

今私の質問は、UnsatisfiedLinkError、linux-gate.so.1、または関数 jstring2char? の原因は何かということです。コミュニティから得られるヒントは何ですか?

どうもありがとうございました。[1]:

4

1 に答える 1