运行时使用STL将错误与NDK链接

时间:2015-01-20 20:16:21

标签: java android c++ eclipse android-ndk

我一直在争取在Android上使用Cpp程序几天,我遇到了一个我认为可能是个bug的问题。我正在使用SDL2,但没有其他库,我也在使用SDL android项目模板。

基本程序运行正常,但我想使用Cpp stdlibs和STL,所以根据说明,我将APP_STL:= stlport_static添加到Application.mk并重建程序但是之后应用程序只显示一个空白屏幕然后崩溃,调试说:

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-build和Eclipse,在Samsung Galaxy S3上运行应用程序。

我在网上搜索,确实有很多类似的问题,其中一个地方据说没有同时建成armeabi和armeabi-v7,但这没有帮助。

1 个答案:

答案 0 :(得分:5)

这似乎与许多其他近期问题相同,例如Cannot load library: reloc_library[1285]: cannot locate 'rand'。问题是您使用android-21 API构建应用。 signal函数(就像rand)曾经是标题中的内联函数(分别将代码重定向到bsd_signallrand48),但在{{1}中添加了新函数,因此标题中不再有这些内容。

因此,如果您希望自己的应用在android-21之前的平台上运行,则需要确保使用希望代码运行的最低API级别来构建本机代码,例如:在android-21中添加APP_PLATFORM := android-9

如果您需要较新功能,jni/Application.mk也应该能够很好地运作。对于21之前的版本,较新的平台版本只添加了之前不存在的新功能(但旧功能表现得像以前一样),所以如果你只使用android-N中存在的功能,它应该适用于android -N即使你使用android-19构建它(对于N <19)。但是21改变了所有这些,之前存在的功能(但重定向到其他功能)现在链接到一个不同的名称(更诚实的是),这在之前是不可用的。

这不会影响您可以构建Java代码(如果有)的API级别,但是,如果您愿意,仍然可以构建针对最新API的部分。