运行时链接错误与Android上的SDL_Mixer和SMPEG2

时间:2015-01-22 16:34:43

标签: android c++ android-ndk sdl unsatisfiedlinkerror

我设法修复了以前我用NDK引起的链接问题,这是由android api 21引起的,并且设法让SDL_TTF内置并且工作轻松,但是使用SDL_Mixer我遇到了另一个运行时不满意的内容错误,其中app无论如何都无法链接smpeg2 lib与SDL2_Mixer。这次我看不出它与api-level有什么关系,并尝试了我能想到的所有内容,遍历每个makefile并对每个版本进行三重检查。

我使用SDL_Mixer 2.0.0和smpeg2-2.0.0作为唯一的依赖。 Smpeg2位于jni /文件夹中,整个过程都是在没有编译器咳嗽的情况下构建的。

我下载了SDL_Mixer 2.0.0源码并将其放入jni /文件夹,将smpeg2-2.0.0从它的外部/文件夹复制到jni /并从混音器makefile设置为仅构建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 个答案:

答案 0 :(得分:0)

您需要以反向依赖顺序加载库。也就是说,如果libSDL2_mixer.so取决于libsmpeg2.so,则首先需要先加载libsmpeg2.so,然后才能尝试加载libSDL2_mixer.so

也就是说,为了加载库,您需要这样做:

System.loadLibrary("smpeg2");
System.loadLibrary("SDL2_mixer");

IIRC已经在一些最新版本的Android中修复了这个版本,但是为了让旧版本的版本正常工作,您需要一次只显示一个版本。