Android - 调用System.loadLibrary()会导致进程死亡

cla*_*ark 5 c++ java-native-interface android android-ndk

我决定采用移植游戏,它使用SDL库并大量使用C++和STL,而不是Android.我已经成功地编译了所有必需的库以及游戏的所有源文件.我的问题是,当我调用System.loadLibrary()为游戏加载.so时,应用程序会立即崩溃"Process org.libsdl.app(pid 3569)已经死亡."

这是代码部分,我将所有需要的库和游戏作为共享库加载.

    static {
       // Load the required libraries for the game
       System.loadLibrary("SDL");
       System.loadLibrary("SDL_image");
       System.loadLibrary("SDL_mixer");
       System.loadLibrary("SDL_net");
       // load the game as a shared library
       System.loadLibrary("smw_jni"); // << process dies when this is called
    }
Run Code Online (Sandbox Code Playgroud)

libswm_jni.so是使用Android NDK和我指定的Applicaion.mk文件编译的

APP_STL := gnustl_static
Run Code Online (Sandbox Code Playgroud)

因为它在System.loadLibrary("smw_jni")之后立即崩溃而没有有意义的错误消息,所以我不知道如何去找到根本原因.

我已经致力于移植另一款游戏,这只是普通的旧C代码,但是我不确定这个特定的游戏在C++方面是否很重要.

提前感谢我对此头痛的任何帮助!

-clark-

cla*_*ark 6

用这个把头发拉出来之后我终于找到了问题所在.事实证明,其中一个类正在对不存在的文件执行某些文件IO.如果其他人遇到加载共享库的问题,我就是这样做的.

我在调用System.loadLibrary()时启用了断点,当执行在此断点处暂停时,我使用stacktrace获取一些未在logcat中提供的额外信息.

由于有相当多的信息,我有堆栈跟踪传输到文件,所以我可以分析它.这是我使用的命令

# adb shell strace -p pid > strace.log
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助任何在屁股问题上遇到类似痛苦的人.

-clark-