Android: Calling System.loadLibrary () hace que el proceso muera

He decidido llevar a portar un juego, que utiliza las bibliotecas SDL y hace un uso intensivo de C + + y la STL, a Android. He tenido éxito en obtener todas las bibliotecas necesarias compiladas, así como todos los archivos de origen para el juego. Mi problema es que cuando llamo System.loadLibrary () para cargar el. Así que para el juego, la aplicación se bloquea inmediatamente con "Proceso org.libsdl.app (pid 3569) ha muerto."

Esta es la sección de código donde carga todas las bibliotecas necesarias y el juego como una biblioteca compartida.

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 se compiló con el Android NDK y en el archivo Applicaion.mk que especificé

 APP_STL := gnustl_static 

Dado que se bloquea inmediatamente después de System.loadLibrary ("smw_jni") sin mensajes de error significativos, estoy en una pérdida en cuanto a cómo ir sobre cómo llegar a la causa raíz.

He trabajado en portar otro juego que era simplemente código C antiguo, que funcionó, así que no estoy seguro de si hay un problema con el hecho de que este juego en particular es pesado en el lado de C + +.

Gracias de antemano por cualquier ayuda con este dolor de cabeza de la mía!

-clark-

Después de sacarme el pelo con este, finalmente me di cuenta del problema. Resulta que una de las clases estaba realizando algún archivo IO en archivos que no existían. En caso de que alguien más encuentre un problema con la carga de una biblioteca compartida, aquí es lo que hice para calcular esto.

Habilité un punto de interrupción en la llamada a System.loadLibrary () y cuando la ejecución se detuvo en este punto de interrupción, utilicé stacktrace para obtener alguna información adicional que no se proporcionaba en logcat.

Dado que había un poco de información que tenía stacktrace canalizado a un archivo para poder analizarlo. Aquí está el comando que usé

 # adb shell strace -p pid > strace.log 

Espero que esto ayude a cualquiera que se encuentre con un dolor similar en el problema de culo.

-clark-

Sólo necesita llamar a loadLibaray() en la biblioteca que realmente expone una interfaz JNI. El sistema debe hacerse cargo de cargar cualquier biblioteca dependiente, así que no creo que necesites cargar SDL_ *. ¿Qué dice el logcat?

  • ¿Cómo hacer una llamada correcta desde Android a una función no estática en Java? (Cocos2Dx en la mezcla)
  • Extraer código de archivo .aar Android
  • Devuelve una matriz String en un método JNI
  • La compilación con NDK da error para los archivos de encabezado incluidos correctamente
  • Módulos no definidos al cambiar a una versión más reciente de android ndk
  • Biblioteca no encontrada debido a targetSdkVersion (armeabi-v7a y libcryptopp.so)
  • Android: 'No se pudo cargar Foo: findLibrary returned null'
  • ¿Cómo compartir una variable entre Java y C en android JNI?
  • Cómo almacenar en caché los mapas de bits en la memoria nativa
  • Integración de jpct-ae con el motor Vuforia de Qualcomm en android
  • Android ICS: intento de error JNI para usar referencia local obsoleta 0x1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.