System.loadLibrary 卡住,永远不会 returns
System.loadLibrary get stuck and never returns
我们的游戏在 Android 下以 API 级别 15(或 14,尚未测试以前的版本)加载我们的主库时停止。 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++_shared
、gnustl_static
或 gnustl_shared
进行编译;
- 停用一些我们链接 libMain 的静态库。由于这是一个非常漫长的操作,我们只停用了极少数;
- 停用混淆器
我们可以做些什么来追踪这个问题?
感谢您的帮助
SO 参考:
- Loading a shared library with the System.loadLibrary call never returns
- android load library failed
我们发现问题出自本机 OpenGL 调用,该调用出现死锁。
此处的要点是连接您的本机 gdb 调试器并中断本机代码中的某处以了解发生了什么。
我们的游戏在 Android 下以 API 级别 15(或 14,尚未测试以前的版本)加载我们的主库时停止。 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++_shared
、gnustl_static
或gnustl_shared
进行编译; - 停用一些我们链接 libMain 的静态库。由于这是一个非常漫长的操作,我们只停用了极少数;
- 停用混淆器
我们可以做些什么来追踪这个问题?
感谢您的帮助
SO 参考:
- Loading a shared library with the System.loadLibrary call never returns
- android load library failed
我们发现问题出自本机 OpenGL 调用,该调用出现死锁。
此处的要点是连接您的本机 gdb 调试器并中断本机代码中的某处以了解发生了什么。