我有一个通过NDK / JNI使用本机库的android服务。本地库按建议静态加载/初始化...
static {
System.loadLibrary("mylibrary");
if (!nativeClassInit())
throw new RuntimeException("native init failed");
}
一切正常,直到服务停止(例如,从可以启动/停止服务的UI活动)。问题是当服务停止时,任务尚未被android杀死,如果用户重新启动服务,则不会重新加载本机库,并且对本机函数的调用会导致本机代码崩溃?
我尝试在重启后再次调用nativeClassInit()方法,但这没有用? 另外,我在其他帖子中看到Android中不允许卸载本机库。
答案 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。我试着回忆一下静态初始化方法但发生了同样的崩溃。