【问题标题】:System.loadLibrary get stuck and never returnsSystem.loadLibrary 卡住并且永远不会返回
【发布时间】:2016-05-05 10:23:48
【问题描述】:

我们的游戏在使用 API 级别 15(或 14,尚未测试以前的版本)的 Android 下加载我们的主库时停止。 这不会发生在 API 级别 16 及以上的设备上。

我们正在使用 NDK,因此我们的 Main.java 在其末尾包含以下行:

static {
    boolean bFMODReady = false;
    try {
      System.loadLibrary("fmod");
      System.loadLibrary("fmodstudio");
      bFMODReady = true;
    } catch (UnsatisfiedLinkError e) {
        Log.e(TAG, "Unable to load FMOD (" + e.getLocalizedMessage() + ")");
    }

    if (BuildConfig.AMAZON) {
        System.loadLibrary("AmazonGamesJni");
    }

    System.loadLibrary("Main");

    if (!bFMODReady) {
        Log.e(TAG, "FMOD is not ready -> disable audio");
        disableAudio();
    }
}

游戏在启动时停止并显示以下日志:

05-05 00:30:39.017 598-598/com.snip.snap D/dalvikvm: Trying to load lib /mnt/asec/com.snip.snap-1/lib/libMain.so 0x4175c7e8

仅此而已。根据之前的日志,fmod、fmodstudio 和 AmazonGamesJni 库加载正常。

显然,无论出于何种原因,libMain.so 的加载都会卡住。我们正在针对c++_static(使用Application.mk 文件中的APP_STL 值)编译我们的库。我们也在使用 Proguard 和 multidex。

以下是我们尝试解决此问题但失败的方法:

  • 针对c++_sharedgnustl_staticgnustl_shared 进行编译;
  • 停用我们链接 libMain 的一些静态库。由于这是一个非常漫长的操作,我们确实只停用了少数几个;
  • 停用proguard

我们可以做些什么来追踪问题?

感谢您的帮助

所以参考:

【问题讨论】:

  • 您是否尝试过附加本机调试器,或使用 SIGABRT (kill -6 pid; sleep 1; kill -6 pid) 终止进程以在 logcat 中获取本机堆栈转储?知道卡在哪里会非常有用。
  • 嘿fadden,感谢您的回答。我们确实使用本机调试器运行了游戏,但我们意识到它因为 OpenGL|ES 初始化函数而卡住了。感谢您的帮助!

标签: java android c++ android-ndk shared-libraries


【解决方案1】:

我们发现问题来自于死锁的原生 OpenGL 调用。

这里的要点是连接您的本机 gdb 调试器并在您的本机代码中的某处中断以了解发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 2019-12-21
    • 1970-01-01
    • 2019-03-02
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多