Android NDK-无法加载库:在Android 17及以下版本上加载_库

Android NDK-无法加载库:在Android 17及以下版本上加载_库,android,android-ndk,Android,Android Ndk,我正在使用实验性的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") ... }

我正在使用实验性的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")
    ...
}
当我尝试用以下代码加载带有AndroidNDK的本机库时

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
02-23 13:50:05.877 1937-1937/?D/dalvikvm:延迟启用CheckJNI
02-23 13:50:05.905 1937-1944/? E/jdwp:向调试器发送答复失败:管道断开
02-23 13:50:05.905 1937-1944/? D/dalvikvm:调试器已分离;对象注册表有1个条目
02-23 13:50:05.961 1937-1937/? D/dalvikvm:正在尝试加载lib/data/data/com.mycompany.helloworld/lib/libhelloworld.so 0xa6d15c60
02-23 13:50:05.961 1937-1937/? W/dalvikvm:异常Ljava/lang/unsatifiedLinkError;初始化Lcom/mycompany/helloworld/MainActivity时引发;
02-23 13:50:05.961 1937-1937/? W/dalvikvm:newInstance调用中的类初始化失败(Lcom/mycompany/helloworld/MainActivity;)
02-23 13:50:05.961 1937-1937/? D/AndroidRuntime:关闭虚拟机
02-23 13:50:05.961 1937-1937/? W/dalvikvm:threadid=1:线程以未捕获异常退出(组=0xa6296288)
02-23 13:50:05.969 1937-1937/? E/AndroidRuntime:致命异常:主
java.lang.ExceptionInInitializeError
位于java.lang.Class.newInstanceImpl(本机方法)
位于java.lang.Class.newInstance(Class.java:1319)
位于android.app.Instrumentation.newActivity(Instrumentation.java:1053)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
在android.app.ActivityThread.access$600(ActivityThread.java:130)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:4745)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.UnsatifiedLink错误:无法加载库:加载库[1098]:未找到库“/system/lib/libhoudini.so”
位于java.lang.Runtime.loadLibrary(Runtime.java:370)
位于java.lang.System.loadLibrary(System.java:535)
在com.mycompany.helloworld.MainActivity。(MainActivity.java:15)
位于java.lang.Class.newInstanceImpl(本机方法)
位于java.lang.Class.newInstance(Class.java:1319)
位于android.app.Instrumentation.newActivity(Instrumentation.java:1053)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
在android.app.ActivityThread.access$600(ActivityThread.java:130)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:4745)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(本机方法)
02-23 13:55:06.113 1937-1937/? I/进程:发送信号。PID:1937信号:9
以下是一个项目示例:


< /P> < P>问题是,当使用C++运行库的共享库变体时,需要在其他库之前加载,所以解决方案不是这样:

static {
    System.loadLibrary("libname");
}
使用此选项:

static {
    System.loadLibrary("gnustl_shared");
    System.loadLibrary("libname");         
}
在下面链接的“共享运行时”部分找到了解决方案:

如果你的应用目标是Android 4.3之前的版本 (Android API级别18),并且您使用 给定C++运行时,必须在任何其他节点之前加载共享库 依赖它的图书馆

例如,一个
static {
  System.loadLibrary("stlport_shared");
  System.loadLibrary("bar");
  System.loadLibrary("foo");
}