Ошибка связывания во время выполнения с SDL_Mixer и SMPEG2 на Android
Мне удалось исправить предыдущую проблему компоновки, которая была у меня с NDK, которая была вызвана Android Api 21, и мне удалось создать и работать SDL_TTF, и легко, но с SDL_Mixer я столкнулся с другой средой выполнения Unsatisfiedlinkererror, где приложение каким-то образом не может связать smpeg2 lib с SDL2_Mixer. На этот раз я не понимаю, как это может иметь какое-либо отношение к api-уровню, и перепробовал все, что мог придумать, прошел каждый make-файл и провел тройную проверку каждой версии.
Я использую SDL_Mixer 2.0.0 и smpeg2-2.0.0 в качестве единственной зависимости. Smpeg2 находится в папке jni/, и все это создается без кашля компилятора.
Я скачал исходный код SDL_Mixer 2.0.0 и поместил его в папку jni/, скопировал smpeg2-2.0.0 из его внешней / папки в jni/ и установил из make-файла микшера для сборки только smpeg2. Я отредактировал src/Android.mk, чтобы увидеть исходный код микшера и получить общую библиотеку, а затем отредактировал SDLActivity, чтобы получить библиотеку SDL2_mixer. SDL_TTF работал таким образом.
libsmpeg2.so существует в папке libs/, поэтому я не вижу, как он не может ее найти.
Я использую Android-19 в качестве цели сборки для NDK, компилятор не выдает никаких предупреждений или ошибок.
01-22 18:17:43.760: D/dalvikvm(22101): Trying to load lib /data/data/com.kebabkeisari.peli/lib/libSDL2.so 0x41d88e78
01-22 18:17:43.760: D/dalvikvm(22101): Added shared lib /data/data/com.kebabkeisari.peli/lib/libSDL2.so 0x41d88e78
01-22 18:17:43.760: D/dalvikvm(22101): Trying to load lib /data/data/com.kebabkeisari.peli/lib/libSDL2_mixer.so 0x41d88e78
01-22 18:17:43.765: W/dalvikvm(22101): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/libsdl/app/SDLActivity;
01-22 18:17:43.765: W/dalvikvm(22101): Class init failed in newInstance call (Lcom/kebabkeisari/peli/Ribale;)
01-22 18:17:43.765: D/AndroidRuntime(22101): Shutting down VM
01-22 18:17:43.765: W/dalvikvm(22101): threadid=1: thread exiting with uncaught exception (group=0x410c52a0)
01-22 18:17:43.765: E/AndroidRuntime(22101): FATAL EXCEPTION: main
01-22 18:17:43.765: E/AndroidRuntime(22101): java.lang.ExceptionInInitializerError
01-22 18:17:43.765: E/AndroidRuntime(22101): at java.lang.Class.newInstanceImpl(Native Method)
01-22 18:17:43.765: E/AndroidRuntime(22101): at java.lang.Class.newInstance(Class.java:1319)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.app.Instrumentation.newActivity(Instrumentation.java:1057)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.app.ActivityThread.access$600(ActivityThread.java:140)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.os.Handler.dispatchMessage(Handler.java:99)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.os.Looper.loop(Looper.java:137)
01-22 18:17:43.765: E/AndroidRuntime(22101): at android.app.ActivityThread.main(ActivityThread.java:4898)
01-22 18:17:43.765: E/AndroidRuntime(22101): at java.lang.reflect.Method.invokeNative(Native Method)
01-22 18:17:43.765: E/AndroidRuntime(22101): at java.lang.reflect.Method.invoke(Method.java:511)
01-22 18:17:43.765: E/AndroidRuntime(22101): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
01-22 18:17:43.765: E/AndroidRuntime(22101): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
01-22 18:17:43.765: E/AndroidRuntime(22101): at dalvik.system.NativeStart.main(Native Method)
01-22 18:17:43.765: E/AndroidRuntime(22101): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1892]: 1952 could not load needed library 'libsmpeg2.so' for 'libSDL2_mixer.so' (load_library[1094]: Library 'libsmpeg2.so' not found)
01-22 18:17:43.765: E/AndroidRuntime(22101): at java.lang.Runtime.loadLibrary(Runtime.java:370)
01-22 18:17:43.765: E/AndroidRuntime(22101): at java.lang.System.loadLibrary(System.java:535)
01-22 18:17:43.765: E/AndroidRuntime(22101): at org.libsdl.app.SDLActivity.<clinit>(SDLActivity.java:51)
01-22 18:17:43.765: E/AndroidRuntime(22101): ... 15 more
1 ответ
Вам необходимо загрузить библиотеки в обратном порядке зависимости. То есть если libSDL2_mixer.so
зависит от libsmpeg2.so
сначала нужно загрузить libsmpeg2.so
прежде чем вы сможете попробовать загрузить libSDL2_mixer.so
,
То есть, чтобы загрузить библиотеку, вам нужно сделать это:
System.loadLibrary("smpeg2");
System.loadLibrary("SDL2_mixer");
IIRC это было исправлено в некоторых очень свежих версиях Android, но для того, чтобы все работало на старых версиях, вам нужно явно загружать их по одной за раз.