Android so 库 异常保错: is not accessible for the namespace "classloader-namespace" 具体 so 是我自己项目独有的,但是报错应该不是个例,而且下面的错误偶发出现。
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libserial_port.so" needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace "classloader-namespace"
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1669)
at com.nativec.tools.SerialPort.<clinit>(SerialPort.java:111)
at com.rfid.ReaderConnector.connectCom(ReaderConnector.java:36)
at com.urovo.view.base.BaseActivity.initRFID(BaseActivity.java:126)
at com.urovo.view.base.BaseActivity.onCreate(BaseActivity.java:96)
at android.app.Activity.performCreate(Activity.java:7144)
at android.app.Activity.performCreate(Activity.java:7135)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2944)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3099)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6791)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
百度了很多说是:
Android 7.0 行为变更:
解决办法:
更新您的应用
通过下面的一些步骤,您可以修复上述类型的错误并确保您的应用不会在将来的更新版平台上崩溃:
如果您的应用使用私有平台库,您应更新它,以添加该应用自己的库副本或使用公开 NDK API。
如果您的应用使用访问私有符号的第三方库,则联系库作者以更新库。
请确保将您的所有非 NDK 库与您的 APK 打包在一起。
使用标准 JNI 函数而非来自
libandroid_runtime.so
的getJavaVM
和getJNIEnv
:AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
JavaVM::AttachCurrentThread from <jni.h>.使用
__system_property_get
而非来自libcutils.so
的私有property_get
符号。为此,请使用__system_property_get
及以下 include 函数:#include <sys/system_properties.h>
注:系统属性的可用性和内容未通过 CTS 进行测试。应执行进一步修复以避免同时使用这些属性。
使用来自
libcrypto.so
的SSL_ctrl
符号的本地版本。例如,您应在您的.so
文件中静态链接libcyrpto.a
,或从 BoringSSL/OpenSSL 添加一个动态链接的libcrypto.so
版本,并将其打包到您的 APK 中
上面的方法,感觉上就是比较麻烦,而且我这个保错不是必现,需要改动的地方还是有点麻烦的,想着先再试试其他方法。
最后在项目build.gradle 中注释掉指定NDK平台的代码,就OK了。
ndk{
abiFilter 'armeabi-v7a'
}