密接に関連する質問については、 MSOの質問「重複の可能性のある長いリスト—Cメモリ割り当てとオーバーランニング境界」を参照してください。
開発者環境:CentOS 4.7、Kdevelop 3.1.1、gcc 3.4.6
JNIを使用してC++共有ライブラリをロードするJavaテストクライアントを実行します。私のアプリケーションには3つのコンポーネントがあります。
- Javaクライアント
- JNIラッパーとして機能するC++共有ライブラリ。(私はそれを「ラッパーライブラリ」と呼びます)
- ビジネスオブジェクトを含むC++共有ライブラリ。(私はそれを「ビジネスライブラリ」と呼びます)
クライアントを実行すると、非常に頻繁にエラーが発生します*** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
。このエラーは約10〜11回発生し、その後アプリケーションが実行されます。
私のJavaクライアントでは、最初に必要なC++ライブラリを静的コンストラクターに次のようにロードします。
static
{
System.Load("/root/Desktop/libs/businesslibrary");
System.out.println("business library loaded");
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
「ビジネスライブラリがロードされました」というステートメントがコンソールに出力されますが、その後にエラー*** glibc...
が発生します。
ラッパーライブラリのプロジェクト設定では、ビジネスライブラリが依存ライブラリとして指定されています。したがって、businesslibraryをロードする呼び出しを省略して、単に書き込むだけでも、
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
次に、最初にビジネスライブラリがロードされ(グローバル変数作成ログで確認)、次にラッパーライブラリがロードされます。コントロールはJavaクライアントに戻り、「ラッパーライブラリがロードされました」というステートメントがコンソールに出力されます。この後、ネイティブメソッドの呼び出しがあります。ただし、コントロールがこのネイティブメソッドの実装に到達することはありません。その前に、エラーが*** glibc...
再び発生します。また、次のようなネイティブメソッド呼び出しの前に別のJavaクラスの静的メソッドへの呼び出しを挿入すると、
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string.
native method call;
--
--
}
その場合、Try.temp()の出力は出力されません。
これらのアプローチの両方で問題が発生する可能性のある理由は何でしょうか。また、どのように進めればよいですか。