【问题标题】:Runtime linking error with NDK using STL使用 STL 的 NDK 运行时链接错误
【发布时间】:2015-03-19 05:08:45
【问题描述】:

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

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

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,在三星 Galaxy S3 上运行应用程序。

我在网上搜了一下,确实有很多类似的问题,有一个地方说不能同时内置到 armeabi 和 armeabi-v7 中,但这并没有帮助。

【问题讨论】:

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


    【解决方案1】:

    这似乎与许多其他最近的问题相同,例如Cannot load library: reloc_library[1285]: cannot locate 'rand'。问题是您正在使用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-N 上运行即使您使用 android-19 构建它(对于 N

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2015-09-21
      • 2014-11-27
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多