android服务重启后调用JNI崩溃?

时间:2010-12-07 16:52:30

标签: android

我有一个通过NDK / JNI使用本机库的android服务。本地库按建议静态加载/初始化...

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

一切正常,直到服务停止(例如,从可以启动/停止服务的UI活动)。问题是当服务停止时,任务尚未被android杀死,如果用户重新启动服务,则不会重新加载本机库,并且对本机函数的调用会导致本机代码崩溃?

我尝试在重启后再次调用nativeClassInit()方法,但这没有用? 另外,我在其他帖子中看到Android中不允许卸载本机库。

1 个答案:

答案 0 :(得分:0)

我发现通过使服务在自己的私有进程中运行并让服务在其onDestroy()方法中通过android.os.Process.killProcess()解决了我自己的问题。不确定这是否是最正确的方式,但我很乐意听到任何建议。

关于上述评论......

崩溃时尝试执行的本机代码是什么,错误是什么?

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。我试着回忆一下静态初始化方法但发生了同样的崩溃。