我们的游戏停顿了,因为它以15级API(或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(使用APP_STL文件中的Application.mk值)编译库。我们也正在使用Proguard和multidex。

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


针对c++_sharedgnustl_staticgnustl_shared进行编译;
停用一些我们链接libMain的静态库。由于这是一个非常漫长的操作,因此我们仅停用了极少的一部分。
停用Proguard


我们应该怎么做才能找出问题所在?

谢谢你的帮助

SO参考:


Loading a shared library with the System.loadLibrary call never returns
android load library failed

最佳答案

我们发现问题出在本地OpenGL调用中,该调用陷入了僵局。

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

10-08 03:30