【问题标题】:Intermittent Android NDK UnsatisfiedLinkError间歇性 Android NDK UnsatisfiedLinkError
【发布时间】:2012-05-18 00:29:44
【问题描述】:

我遇到了零星的、难以重现的 UnsatisfiedLinkErrors,最常见的情况是我的应用程序已暂停很长时间(即数小时)。这些错误发生在正常工作的 JNI 调用上。

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

【问题讨论】:

  • 您能否确定(例如通过检查进程 ID)活动的“恢复”是否发生在最初加载库的同一进程中?我怀疑简历是在一个从未加载过的新进程中发生的。
  • 假设是这种情况,无论新进程中哪个活动首先开始,确保库只加载一次的正确方法是什么?
  • 简单地尝试在需要它的每个活动中加载它怎么样? java.sun.com/docs/books/jni/html/design.html 建议“如果之前对 System.loadLibrary 的调用已经加载了相同的本机库,则 System.loadLibrary 会静默完成。”
  • 谢谢@Chris。我在我的顶级活动中加载库,但在不同的活动中声明了它的所有方法。在声明方法的同一活动中将库加载到静态块中似乎可以解决问题。静态块似乎在第一次调用任何静态本机方法时执行,即使尚未创建 Activity 的实例。

标签: android android-ndk java-native-interface


【解决方案1】:

每次您使用这样的 Activity 加载库时,

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

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

【讨论】:

  • 您是否有任何证据表明卸载确实会发生?
  • @ChrisStratton 抱歉,之前的说法是错误的。感谢您指出。
  • 就像下面这个答案所说,静态成员存储在永久代部分stackoverflow.com/a/3800592/409315
  • 嗯,实际上,库本身被仿生运行时链接器加载到 DVM 进程中(想想 C 概念而不是 java 概念)。但我想可能有一些关于它的存在的java级数据来启用可以按照你建议的方式处理的jni。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多