android9.0 编译so库遇到的问题以及so库动态打包到apk中
一、android9.0调用so库遇到崩溃的问题:在android4.4上是运行正常的。查看原因:是由于通过 System.loadLibrary(libName); 调用自己写的caijkffmpeg.so加载不成功。2019-11-06 12:36:46.376 22546-22546/com.incall.apps.fotatest E/linker: library "/sys...
一、android9.0调用so库遇到崩溃的问题:在android4.4上是运行正常的。
查看原因:是由于通过 System.loadLibrary(libName); 调用自己写的caijkffmpeg.so加载不成功。
2019-11-06 12:36:46.376 22546-22546/com.incall.apps.fotatest E/linker: library "/system/lib/libcaijkffmpeg.so" ("/system/lib/libcaijkffmpeg.so") needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="", permitted_paths="/data:/mnt/expand:/data/data/com.incall.apps.fotatest"]
2019-11-06 12:36:46.388 22546-22546/com.incall.apps.fotatest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.incall.apps.fotatest, PID: 22546
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcaijkffmpeg.so" needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace "classloader-namespace"
解决办法:在system/etc/public.libraries.txt中添加该so的全名 ,即我的libcaijkffmpeg.so 文件,重启后再加载就能正常运行了。
二、怎样将so库动态打包到apk中
网上的各种方法都比较复杂,这儿分享一个简单的方法将so库动态打包到apk中的方法:在so库所在的工程中找到build.gradle,
需要将so库的目录添加到sourceSets中,如下所示:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
so库的存放在项目中的地址截图如下所示,存放在libs中,所以jniLibs.srcDirs的地址也必须要在libs中:
全部的build.gradle代码如下所示:
apply plugin: 'com.android.library'
android {
compileSdkVersion 19
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
defaultConfig {
minSdkVersion 18
targetSdkVersion 19
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
api files('libs/litepal-1.5.1.jar')
api 'org.jetbrains:annotations-java5:15.0'
}
更多推荐
所有评论(0)