0

(開発環境:CentOS 4.7、KDevelop 3.1.1、gcc 3.4.6)

C++ 共有ライブラリと、この共有ライブラリを使用するテスト実行可能ファイルを作成しました。物事はうまくいきます。

しかし、Java を介してこのライブラリをロードすると、つまり Java が JNI を呼び出し、JNI がこの共有ライブラリをロードすると、「* glibc が検出されました * free(): 次のサイズが無効です」というエラーが表示されます。この後、アプリケーションは終了します。このエラーは、共有ライブラリのロード フェーズ中に発生します。

これの考えられる理由を誰かが提案できますか?

Java バージョン 1.6.0_17 (ビルド 1.6.0_17-b04) を使用しています。このバージョンと C/C++ ランタイム ライブラリとの間に互換性の問題はありますか?

[rpm -q を実行すると、マシンの glibc バージョンが glibc-2.3.4-2.41 として表示され、libstdc++ バージョンが libstdc++-3.4.6-10 として表示されます

ldd of shared library shows the following,
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00173000)
libssl.so.4 => /lib/libssl.so.4 (0x00286000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00185000)
libm.so.6 => /lib/tls/libm.so.6 (0x00111000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00134000)
libc.so.6 => /lib/tls/libc.so.6 (0x002ba000)
/lib/ld-linux.so.2 (0x008a4000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00785000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x003e9000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x0013e000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x006ae000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00672000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x0044e000)
libdl.so.2 => /lib/libdl.so.2 (0x00540000)
libz.so.1 => /usr/lib/libz.so.1 (0x00141000)

]

4

2 に答える 2

1

エラーが発生したときにコードが実行されていないことを確認してください。JNI OnLoad 関数はありますか? いくつかの静的コンストラクター?

一般的に、あなたが説明する全体的な構造は「うまく機能する」ので、あなたのコードを見てみたいと思います。

デバッガーで Java を実行し、(Java で) ブレークポイントを System.loadLibrary の直前に配置すると、gdb を使用してプロセスにアタッチし、ブレークポイントを自由に設定できます。次に、Java デバッガーを続行し、gdb に表示される内容を確認します。

于 2010-02-27T21:51:08.980 に答える
0

gcc が ABI に対して行うことについては、http: //gcc.gnu.org/onlinedocs/libstdc++/manual/abi.htmlの章と gcc ドキュメントの次の章を参照してください。

于 2010-02-26T15:26:23.367 に答える