NDK使用STL时发生运行时链接错误

Runtime linking error with NDK using STL

本文关键字:运行时 链接 错误 使用 STL NDK      更新时间:2023-10-16

几天来,我一直在努力在Android上获得Cpp程序,但我遇到了一个问题,我认为这可能是一个错误。我使用SDL2,但没有其他库,我也使用SDL android项目模板。

基本程序运行良好,但我想使用Cpp stdlibs和STL,所以根据说明,我将APP_STL:=stlport_static添加到Application.mk并重新构建了程序,但在此之后,应用程序只显示一段时间的空白屏幕,然后崩溃,debug说如下:

01-20 22:10:14.817: D/dalvikvm(26097): Trying to load lib /data/data/com.kebabkeisari.peli/lib/libSDL2.so 0x41d06890
01-20 22:10:14.817: W/dalvikvm(26097): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/libsdl/app/SDLActivity;
01-20 22:10:14.817: W/dalvikvm(26097): Class init failed in newInstance call (Lcom/kebabkeisari/peli/Ribale;)
01-20 22:10:14.822: D/AndroidRuntime(26097): Shutting down VM
01-20 22:10:14.822: W/dalvikvm(26097): threadid=1: thread exiting with uncaught exception (group=0x4109f2a0)
01-20 22:10:14.827: E/AndroidRuntime(26097): FATAL EXCEPTION: main
01-20 22:10:14.827: E/AndroidRuntime(26097): java.lang.ExceptionInInitializerError
01-20 22:10:14.827: E/AndroidRuntime(26097):    at java.lang.Class.newInstanceImpl(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at java.lang.Class.newInstance(Class.java:1319)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.app.Instrumentation.newActivity(Instrumentation.java:1057)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.os.Looper.loop(Looper.java:137)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at android.app.ActivityThread.main(ActivityThread.java:4898)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at java.lang.reflect.Method.invokeNative(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at java.lang.reflect.Method.invoke(Method.java:511)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at dalvik.system.NativeStart.main(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]:  1951 cannot locate 'signal'...
01-20 22:10:14.827: E/AndroidRuntime(26097):    at java.lang.Runtime.loadLibrary(Runtime.java:370)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at java.lang.System.loadLibrary(System.java:535)
01-20 22:10:14.827: E/AndroidRuntime(26097):    at org.libsdl.app.SDLActivity.<clinit>(SDLActivity.java:49)
01-20 22:10:14.827: E/AndroidRuntime(26097):    ... 15 more

因此程序在运行时链接失败。STL是罪魁祸首,是的,我尝试过gnustl和其他方法,但也出现了同样的问题。

我正在使用ndk构建和Eclipse,在三星Galaxy S3上运行应用程序。

我搜索了一下网络,确实有很多类似的问题,有一个地方说不要同时构建armeabi和armeabi-v7,但这无济于事。

这似乎与最近的许多问题相同,如无法加载库:reloca_library[1285]:无法定位';兰特';。问题是您正在使用android-21 API构建应用程序。signal函数(就像rand一样(曾经是头中的内联函数(分别将代码重定向到bsd_signallrand48(,但在android-21中添加了新函数,因此这些函数不再是头中内联。

因此,如果您希望应用程序在早于android-21的平台上运行,则需要确保使用您希望代码运行的最低API级别构建本机代码,例如在jni/Application.mk中添加APP_PLATFORM := android-9

如果您需要更新的功能,android-19也应该能很好地工作。对于21之前的版本,较新的平台版本只添加了以前不存在的新函数(但旧函数的行为与以前一样(,因此,如果您只使用android-N中存在的函数,即使您使用android-19构建它(对于N<19(,它也应该在android-N上工作。但21改变了这一切,以前存在的函数(但重定向到其他函数(现在链接到了一个以前不可用的不同名称(老实说,更正确的名称(。

这并不影响您可以使用什么样的API级别构建java代码(如果有的话(-如果您愿意,您仍然可以针对最新的API构建该部分。