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

时间:2011-09-15 19:28:10

标签: android c++ java-native-interface android-ndk

我决定将一个使用SDL库并大量使用C ++和STL的游戏移植到Android上。我已经成功地编译了所有必需的库以及游戏的所有源文件。我的问题是,当我调用System.loadLibrary()为游戏加载.so时,应用程序会立即崩溃,因为“进程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
    }

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

APP_STL := gnustl_static

由于它在System.loadLibrary(“smw_jni”)之后立即崩溃且没有有意义的错误消息,因此我不知道如何找到根本原因。

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

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

-Clark -

2 个答案:

答案 0 :(得分:6)

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

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

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

# adb shell strace -p pid > strace.log

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

-Clark -

答案 1 :(得分:0)

您只需要在实际公开JNI接口的库上调用loadLibaray()。他们的系统应该负责加载任何依赖库,所以我认为你不需要加载SDL_ *。 logcat说什么?