2010-12-07 76 views
0

我有一個通過NDK/JNI使用本地庫的android服務。直到該服務被停止本機庫靜態加載/所建議的初始化...android服務重啓後調用JNI崩潰?

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

一切工作正常(例如,從哪裏服務可開始UI活動/停止)。問題是什麼時候該服務被停止的任務還沒有被android殺死,如果用戶重新啓動服務,本地庫不會重新加載,並調用本地函數會導致本機代碼崩潰?

我試過在重新啓動後再次調用nativeClassInit()方法,但這沒有幫助? 另外,我在其他文章中看到,在Android中不允許卸載本機庫。

+0

本機代碼在崩潰時試圖執行什麼操作?錯誤是什麼? – 2010-12-07 17:09:40

回答

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,jobject-s等)? 是的,我在Onload方法中保留了JVM,並在我的靜態初始化方法中保留了JNI類ID &方法ID。我試着回想起靜態初始化方法,但發生了同樣的崩潰。