java - 使用 STL 与 NDK 的运行时链接错误

标签 java android c++ eclipse android-ndk

几天来,我一直在努力争取在 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,在 Samsung Galaxy S3 上运行应用程序。

网上搜了一下,确实有一大堆类似的问题,有一处说不能同时build into armeabi和armeabi-v7,但是没用。

最佳答案

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

因此,如果您希望您的应用在 android-21 之前的平台上运行,您需要确保使用您希望代码运行的最低 API 级别构建 native 代码,例如通过在 jni/Application.mk 中添加 APP_PLATFORM := android-9

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

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

关于java - 使用 STL 与 NDK 的运行时链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28054376/

相关文章:

javascript - 如何将字符串转换为 React 组件

android以编程方式设置按钮背景

android - 如果应用程序关闭,则不会收到 Firebase 推送通知

java - 当我在其中添加文本时,如何使 android View 动态增长?

C++ Builder 派生的 TComboBox 默认有 Items

java - 为什么 boolean 数据类型需要 8 位?

java - 在java中使用sshj时ssh时出现问题

c++ - 通过引用传递参数与使用实例变量

c++ - 在 Excel 自动化中使用非本地化公式

java - 使用java中的对象类方法从用户线程中断主线程