Android - вызов System.loadLibrary () приводит к смерти процесса - PullRequest
5 голосов
/ 15 сентября 2011

Я решил заняться портированием игры, которая использует библиотеки 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 ]

6 голосов
/ 20 сентября 2011

После того, как выдернул мне волосы, я наконец-то понял проблему.Оказывается, один из классов выполнял некоторые операции ввода-вывода для файлов, которые не существовали.В случае, если кто-то еще сталкивается с проблемой при загрузке разделяемой библиотеки, вот что я сделал, чтобы выяснить это.

Я включил точку останова при вызове System.loadLibrary () и когда выполнение остановилось на этой точке остановаЗатем я использовал stacktrace, чтобы получить некоторую дополнительную информацию, которая не была предоставлена ​​в logcat.

Так как было довольно много информации, я поместил stacktrace в файл, чтобы я мог ее проанализировать.Вот команда, которую я использовал

# adb shell strace -p pid > strace.log

Надеюсь, это поможет любому, кто сталкивается с подобной болью в проблеме с задницей.

-clark-

0 голосов
/ 16 сентября 2011

Вам нужно только вызвать loadLibaray() в библиотеке, которая фактически предоставляет интерфейс JNI. Система должна заботиться о загрузке любых зависимых библиотек, поэтому я не думаю, что вам нужно загружать SDL_ *. Что говорит logcat?

...