Gradle架构中使用jar版的so库

作者: SpikeKing | 来源:发表于2017-09-21 14:56 被阅读469次

    欢迎Follow我的GitHub,关注我的简书

    Android使用Gradle架构的Android应用,需要对.so库做特殊的处理,因为会找不到,就会导致编译正确,使用错误;常见的使用情况是根据不同的cpu,有不同的库,包括:armeabi,mips,x86等。Jar版的so库,比正常的so库,体积减少

    Gradle

    报错:

    java.lang.UnsatisfiedLinkError: 
    Couldn't load weibosdkcore from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xxx.apk"],
    nativeLibraryDirectories=[/data/app-lib/xxx-2, /vendor/lib, /system/lib]]]: 
    findLibrary returned null
    

    注意:如果是64位的环境,则文件夹需要由lib转换为lib64。

    有两种方法可以解决:

    1. 将“.so”库生成jar

    把jar引入项目即可,需要注意目录的顺序:
    -lib
    --armeabi
    ---xxx.so
    命令:jar cvf xxx_cpu.jar ./lib,再加载到应用中,即可;

    2. 使用gradle配置

    在Android{}的范围内,添加:

        //noinspection all
        task copyNativeLibs(type: Copy) {
            // third party lib so
            from(new File(projectDir, 'libs')) { include 'armeabi/*.so' }
            into new File(buildDir, 'native-libs')
        }
    
        tasks.withType(JavaCompile) {
            compileTask ->
                //noinspection all
                compileTask.dependsOn copyNativeLibs
        }
    
        //noinspection all
        tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
            pkgTask ->
                pkgTask.jniFolders = new HashSet<File>()
                pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
        }
    

    即可,“//noinspection all”可以去除warning。

    注意,添加64位的abi支持:

    APP_ABI=all32 is equivalent to APP_ABI=armeabi,armeabi-v7a,x86,mips.
    APP_ABI=all64 is equivalent to APP_ABI=arm64-v8a,x86_64,mips64.
    

    参考

    未找到64位的so文件:

    E/AndroidRuntime( 5043): 
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/app/ChunyuDoctor_V500_20150123.apk"],
    nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] 
    couldn't find "libcytool.so"
    

    已经找到,但是非64位:

    LogSummaryInfo: {apkName, me.chunyu.ChunyuDoctor }
    {version, 5.0.0.20150126 }
    {reason, java.lang.UnsatisfiedLinkError: 
    dlopen failed: "/system/lib64/libcytool.so" is 32-bit instead of 64-bit }
    

    预先生成64位的so文件,并添加入相应的64位文件夹内,在预转push时,即可推送到相应的文件夹。

    相关文章

      网友评论

      本文标题:Gradle架构中使用jar版的so库

      本文链接:https://www.haomeiwen.com/subject/ebnzsxtx.html