2010-12-07 16 views
0

NDK/JNI経由のネイティブライブラリを使用するアンドロイドサービスがあります。サービスが停止されるまで、ネイティブライブラリを静的にアンドロイドサービスを再起動した後、JNIクラッシュを呼び出すか?

static { 
    System.loadLibrary("mylibrary"); 
    if (!nativeClassInit()) 
     throw new RuntimeException("native init failed"); 
} 

すべてが正常に動作します...提案されているように初期化/ロードされている(例えば、サービスが開始されるUIの活動から/停止)。問題は、サービスが停止され、アンドロイドによってタスクがまだ殺されていない場合で、ユーザーがサービスを再起動すると、ネイティブライブラリが再ロードされず、ネイティブ関数の呼び出しによってネイティブコードがクラッシュすることです。

再起動後に再度nativeClassInit()メソッドを呼び出そうとしましたが、これは役に立ちませんか? また、他の記事で、ネイティブライブラリのアンロードがAndroidでは許可されていないことがわかりました。

+0

クラッシュしたときのネイティブコードとは何ですか?そのエラーは何ですか? –

+0

サービスの再起動の間にネイティブ側のJNIポインタ(JniENV、jobject-sなど)を保持していますか? – ognian

答えて

0

サービスを独自のプライベートプロセスで実行し、android.os.Process.killProcess()によってonDestroy()メソッドでサービス自体を強制終了させると、私の問題が解決されました。これが最も正しい方法であるかどうかはわかりませんが、何か提案がありましたら幸いです。上記のコメントに関しては

...

何をネイティブコードは、それがクラッシュしたときに実行しようとすると、エラーが何であるのか?

The native code crashed as soon as an internal native library function was called just before the crash an __android_log_print was done displaying the correct parameter values passed in. Its hard to say what exactly happened from the dump. 

あなたはサービスの再起動の間にネイティブ側にいくつかのJNIポインタ(JNIEnvの、jオブジェクト-Sなど)を保存しますか? はい、私はJVMをOnloadメソッドで保持し、静的初期化メソッドではJNIクラスID &メソッドIDも保持します。私は静的初期化メソッドを呼び戻そうとしましたが、同じクラッシュが発生しました。

関連する問題