Javaとネイティブ部分を持つAndroidアプリケーションを書いています。Java 部分はネイティブ部分にメッセージを送信し、応答を受け取ります。ネイティブ部分はすべて別のスレッドで動作し、回答が返されたらメイン スレッドで回答を処理したいと考えています。これが私の拡張 Application クラスの一部です。
@Override
public void OnMessage(final Message msg, final long answerTo) {
Log.i(TAG, msg.ToStr()); // OK
handler.post(new Runnable() {
@Override
public void run() {
Log.i(TAG, msg.ToStr()); // Fatal signal 11 (SIGSEGV)
// at 0x74616862 (code=1), thread 13255
}
});
}
ネイティブ コードは、そのスレッドで OnMessage メソッドを呼び出し、それを Handler を介して UI スレッドに渡そうとします。また、UI スレッド内で msg のメソッドを使用しようとすると、プログラムが SEGSEGV で失敗します。
重要な事実は、Message クラスが C++ Message クラスのラッパーであることです。ラッパーはSWIGによって生成されました。
GDB でデバッグしようとしましたが、GDB はネイティブの Message.toStr メソッドで終了するスタック トレースも表示します。しかし、gdb は変数の出力を拒否し、「現在のコンテキストには記号 " * " がありません」と言っています。
この問題を解決するのを手伝ってください。