间歇性Android NDK不满意链接错误

间歇性Android NDK不满意链接错误,android,android-ndk,java-native-interface,Android,Android Ndk,Java Native Interface,我的应用程序暂停了很长一段时间(例如,几个小时),我经常会出现零星的、难以重现的不满意的链接错误。这些错误发生在正常工作的JNI调用上 Android有时会在不完全关闭应用程序的情况下卸载库吗?我在一个活动中加载本机库,但也在另一个活动中使用它。Android是否会破坏加载库的活动并将其卸载,然后在其他使用它的活动恢复时无法重新加载库?每次加载库时,都会出现类似的活动 static { System.loadLibrary("gamescript"); }

我的应用程序暂停了很长一段时间(例如,几个小时),我经常会出现零星的、难以重现的不满意的链接错误。这些错误发生在正常工作的JNI调用上


Android有时会在不完全关闭应用程序的情况下卸载库吗?我在一个活动中加载本机库,但也在另一个活动中使用它。Android是否会破坏加载库的活动并将其卸载,然后在其他使用它的活动恢复时无法重新加载库?

每次加载库时,都会出现类似的活动

   static {
        System.loadLibrary("gamescript");
    }       

然后,库将像本地静态成员一样加载到Activity类中,并且在应用程序处于活动状态之前不会卸载。但是,我怀疑它是否可以从类外访问。

您能否确定(比如通过检查进程ID)活动的“恢复”是否发生在最初加载库的同一进程中?我的怀疑是简历发生在一个从未加载的新流程中。假设是这种情况,那么无论在新流程中哪个活动首先启动,确保库只加载一次的正确方法是什么?在每个需要的活动中加载简历怎么样?建议“如果先前对System.loadLibrary的调用已加载相同的本机库,System.loadLibrary将以静默方式完成。”谢谢@Chris。我在顶级活动中加载库,但在不同的活动中声明了它的所有方法。在声明方法的同一活动中,在静态块中加载库似乎可以解决问题。静态块似乎是在第一次调用任何静态本机方法时执行的,即使尚未创建任何活动实例。您是否有任何证据表明卸载实际上会发生?@ChrisStratton抱歉,前面的语句是错误的。感谢您指出。正如下面的回答所说,静态成员存储在永久生成部分。实际上,库本身通过仿生运行时链接器加载到DVM进程中(想想C概念,而不是java概念)。但我认为有可能存在一些java级别的数据来支持jni,这些数据可以按照您建议的方式进行处理。