一、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'
}

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐