【问题标题】:Android System.loadLibrary stalls while loading native libraryAndroid System.loadLibrary 在加载本机库时停止
【发布时间】:2011-12-19 14:23:56
【问题描述】:

我有一个相当大的共享库文件(= 12 兆字节),其中不包含任何 JNI 代码。

调用System.loadLibrary("some_file") 时,方法从不返回,并且不会生成相关输出。此外,Windows 任务管理器报告模拟器实例并未占用所有 CPU 资源。

我有一个类,代码如下:

static 
{
    System.out.println("Trying");
    System.loadLibrary("some_file");
    System.out.println("Works");
}

这是从 LogCat 给出的输出:

I/System.out(534): Trying
D/dalvikvm(534): Trying to load lib /data/data/app/lib/libsome_file.so 0x40643c20

如果我上传一个使用库 libsome_file.so 的本机测试应用程序并从模拟器 shell 运行它,那么该应用程序可以工作。

是否有任何方法可以调试 System.loadLibrary 正在做什么,或者是否有人有一些提示,为什么 System.loadLibrary 可能永远不会返回?

【问题讨论】:

  • 如果您的库需要其他库,您可能会遇到问题,但我不希望它挂起。我假设您已经成功尝试了较小的库。
  • 我已经尝试了一些 ndk-samples。他们完美地工作。

标签: java android-ndk shared-libraries


【解决方案1】:

我自己找到了问题的解决方案。我没有使用任何额外的调试工具,但遗漏了一些在加载库时运行的代码。特定代码挂起,导致 System.loadLibrary 也挂起。

【讨论】:

【解决方案2】:

添加我的解决方案以防其他人遇到问题。问题在于我们库中静态加载的一些外部依赖项(OpenSceneGraph)。他们只挂在 Android 4.0 上,并且在 4.2 及更高版本上运行良好。

因此,如果您有问题,请在库的 JNI_onLoad 中放置一个 __android_log_print(如果有的话)。如果没有调用,检查所有可以静态调用的函数(注意,有些可能隐藏在宏后面)并尝试删除它们,看看你是否能够加载库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多