高级Android程序员android 开发程序员

Gradle架构中使用jar版的so库

2017-09-21  本文已影响469人  SpikeKing

欢迎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时,即可推送到相应的文件夹。

上一篇 下一篇

猜你喜欢

热点阅读