Android NDK-无法加载库:Android 17及更低版本上的load_library

布鲁诺·科埃略(Bruno Coelho)

我正在使用实验性gradle插件,这是我在gradle文件中的NDK配置。

ndk {
    toolchain = "gcc"
    toolchainVersion = "4.9"
    moduleName = "libname"
    stl = "gnustl_shared"
    cppFlags.add("-std=c++11")
    cppFlags.add("-fexceptions")
    cppFlags.add("-frtti")
    ...
}

当我尝试使用以下代码使用Android NDK加载本机库时

static {
    System.loadLibrary("libname");
}

它可在Android API 18及更高版本上运行,但在Android API 17及以下版本上崩溃。

我收到以下错误日志

02-23 13:50:05.877 1937-1937/? D/dalvikvm: Late-enabling CheckJNI
02-23 13:50:05.905 1937-1944/? E/jdwp: Failed sending reply to debugger: Broken pipe
02-23 13:50:05.905 1937-1944/? D/dalvikvm: Debugger has detached; object registry had 1 entries
02-23 13:50:05.961 1937-1937/? D/dalvikvm: Trying to load lib /data/data/com.mycompany.helloworld/lib/libhelloworld.so 0xa6d15c60
02-23 13:50:05.961 1937-1937/? W/dalvikvm: Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/mycompany/helloworld/MainActivity;
02-23 13:50:05.961 1937-1937/? W/dalvikvm: Class init failed in newInstance call (Lcom/mycompany/helloworld/MainActivity;)
02-23 13:50:05.961 1937-1937/? D/AndroidRuntime: Shutting down VM
02-23 13:50:05.961 1937-1937/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6296288)
02-23 13:50:05.969 1937-1937/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 java.lang.ExceptionInInitializerError
                                                     at java.lang.Class.newInstanceImpl(Native Method)
                                                     at java.lang.Class.newInstance(Class.java:1319)
                                                     at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
                                                     at android.app.ActivityThread.access$600(ActivityThread.java:130)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
                                                     at android.os.Handler.dispatchMessage(Handler.java:99)
                                                     at android.os.Looper.loop(Looper.java:137)
                                                     at android.app.ActivityThread.main(ActivityThread.java:4745)
                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                     at java.lang.reflect.Method.invoke(Method.java:511)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                                                     at dalvik.system.NativeStart.main(Native Method)
                                              Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: load_library[1098]: Library     '/system/lib/libhoudini.so' not found
                                                     at java.lang.Runtime.loadLibrary(Runtime.java:370)
                                                     at java.lang.System.loadLibrary(System.java:535)
                                                     at com.mycompany.helloworld.MainActivity.<clinit>(MainActivity.java:15)
                                                     at java.lang.Class.newInstanceImpl(Native Method) 
                                                     at java.lang.Class.newInstance(Class.java:1319) 
                                                     at android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) 
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
                                                     at android.app.ActivityThread.access$600(ActivityThread.java:130) 
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                     at android.os.Looper.loop(Looper.java:137) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:4745) 
                                                     at java.lang.reflect.Method.invokeNative(Native Method) 
                                                     at java.lang.reflect.Method.invoke(Method.java:511) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                                                     at dalvik.system.NativeStart.main(Native Method) 
02-23 13:55:06.113 1937-1937/? I/Process: Sending signal. PID: 1937 SIG: 9

这是一个项目示例:

https://github.com/4brunu/djinni-hello-world

布鲁诺·科埃略(Bruno Coelho)

问题是,当使用C ++运行时的共享库变体时,需要在其他库之前加载它,因此解决方案是:

static {
    System.loadLibrary("libname");
}

使用这个:

static {
    System.loadLibrary("gnustl_shared");
    System.loadLibrary("libname");         
}

在下面的链接“共享的运行时”部分中找到了解决方案:http : //developer.android.com/ndk/guides/cpp-support.html#ic

如果您的应用程序的目标版本早于Android 4.3(Android API级别18)的Android版本,并且使用了给定C ++运行时的共享库变体,则必须先加载共享库,然后再依赖于此任何其他库。

例如,一个应用程序可能具有以下模块:

libfoo.so

libfoo.so使用的libbar.so

libstlport_shared.so,由libfoo和libbar一起使用

您必须以相反的依赖关系顺序加载库:

static {
  System.loadLibrary("stlport_shared");
  System.loadLibrary("bar");
  System.loadLibrary("foo");
}

这是工作的项目示例:https : //github.com/4brunu/djinni-hello-world/commit/9c1e7aadd3a593419a6004c0528e1972d24f33c9

注意:C ++运行时有多个共享库变体,不仅是gnustl_shared。当前库变体的列表可以在当前链接中找到:http : //developer.android.com/ndk/guides/cpp-support.html#hr

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android 4及更低版本上的Android ASyncTask崩溃

来自分类Dev

KitKat(及更低版本)设备上的Android Material Design

来自分类Dev

Android 4.4及更低版本上的SSLHandshakeException

来自分类Dev

在Android 4.4或更低版本上显示为FAB

来自分类Dev

Android NDK:load_library:找不到位置

来自分类Dev

Android RSA1024加密:Android 4.0.4及更低版本上的数据长度异常

来自分类Dev

在Android 2.3 .X(Gingerbread)及更低版本上修改LayerDrawable图层

来自分类Dev

Android M及更低版本中的LineHeightSpan

来自分类Dev

Android M及更低版本中的LineHeightSpan

来自分类Dev

Android Studio NDK:无法加载库“ libgnustl_shared.so”

来自分类Dev

应用程序在从 Android Studio 安装时崩溃(仅在 android 5 及更低版本上)

来自分类Dev

我如何检查运行我的应用程序的Android设备是否在4.2.2及更低版本上运行

来自分类Dev

我如何检查运行我的应用程序的Android设备是否在4.2.2及更低版本上运行

来自分类Dev

Android 4.2 ndk:库加载崩溃:load_library(linker.cpp:750)|| soinfo_link_image || libhoudini.so || OpenCV的

来自分类Dev

在Android上使用NDK链接SQLite库

来自分类Dev

我可以从运行Android 4.3(或更低版本)的设备访问使用Android HCE的设备吗?

来自分类Dev

是否可以使用Material Design(聚合物)针对更低版本的android 4.3和更低版本开发phonegap应用程序

来自分类Dev

带有iframe嵌入的Android WebView在4.2.2及更低版本中未显示

来自分类Dev

膨胀NavigationView会导致Android 4.4及更低版本中的异常

来自分类Dev

Android:在2.XX或更低版本的Webview中单击时不会弹出

来自分类Dev

不展示适用于Android API 8或更低版本的广告

来自分类Dev

SwipeRefreshLayout在android 22及更低版本上不起作用

来自分类Dev

Android NDK构建共享库

来自分类Dev

NDK版本与Android版本之间的关系

来自分类Dev

NDK在Android的OCR tesseract库上编译警告

来自分类Dev

NDK无法加载库

来自分类Dev

无法解析JNIfunction:Android NDK

来自分类Dev

Android NDK上是否有等效的VirtualAlloc?

来自分类Dev

Android NDK集成:错误:无法加载类BuildType $ Impl

Related 相关文章

  1. 1

    Android 4及更低版本上的Android ASyncTask崩溃

  2. 2

    KitKat(及更低版本)设备上的Android Material Design

  3. 3

    Android 4.4及更低版本上的SSLHandshakeException

  4. 4

    在Android 4.4或更低版本上显示为FAB

  5. 5

    Android NDK:load_library:找不到位置

  6. 6

    Android RSA1024加密:Android 4.0.4及更低版本上的数据长度异常

  7. 7

    在Android 2.3 .X(Gingerbread)及更低版本上修改LayerDrawable图层

  8. 8

    Android M及更低版本中的LineHeightSpan

  9. 9

    Android M及更低版本中的LineHeightSpan

  10. 10

    Android Studio NDK:无法加载库“ libgnustl_shared.so”

  11. 11

    应用程序在从 Android Studio 安装时崩溃(仅在 android 5 及更低版本上)

  12. 12

    我如何检查运行我的应用程序的Android设备是否在4.2.2及更低版本上运行

  13. 13

    我如何检查运行我的应用程序的Android设备是否在4.2.2及更低版本上运行

  14. 14

    Android 4.2 ndk:库加载崩溃:load_library(linker.cpp:750)|| soinfo_link_image || libhoudini.so || OpenCV的

  15. 15

    在Android上使用NDK链接SQLite库

  16. 16

    我可以从运行Android 4.3(或更低版本)的设备访问使用Android HCE的设备吗?

  17. 17

    是否可以使用Material Design(聚合物)针对更低版本的android 4.3和更低版本开发phonegap应用程序

  18. 18

    带有iframe嵌入的Android WebView在4.2.2及更低版本中未显示

  19. 19

    膨胀NavigationView会导致Android 4.4及更低版本中的异常

  20. 20

    Android:在2.XX或更低版本的Webview中单击时不会弹出

  21. 21

    不展示适用于Android API 8或更低版本的广告

  22. 22

    SwipeRefreshLayout在android 22及更低版本上不起作用

  23. 23

    Android NDK构建共享库

  24. 24

    NDK版本与Android版本之间的关系

  25. 25

    NDK在Android的OCR tesseract库上编译警告

  26. 26

    NDK无法加载库

  27. 27

    无法解析JNIfunction:Android NDK

  28. 28

    Android NDK上是否有等效的VirtualAlloc?

  29. 29

    Android NDK集成:错误:无法加载类BuildType $ Impl

热门标签

归档