2010-12-07 75 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。我试着回想起静态初始化方法,但发生了同样的崩溃。