天天看点

NDK图片压缩-libjpeg

NDK图片压缩-libjpeg

使用

十分简单,添加压缩工具aar,一句语句实现批量压缩图片

Android Studio不会添加arr的请移步:https://www.cnblogs.com/zhaoyanjun/p/5776114.html

List<String> pics = CompressImageUtil.compressPictures(paths, "压缩后图片所保存的路径");一句话搞定批量压缩

jni图片压缩,无需配置jni工程和NDK编译支持,直接添加aar库即可,图片压缩库aar下载,libjpeg_release.aar

讲解

CPU架构区别了解:

(1)armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。

(2)armeabiv-v7a: 第7代及以上的 ARM 处理器。兼容armeabi

(3)arm64-v8a: 第8代、64位ARM处理器,很少设备。兼容armeabi

(4)x86: 平板、模拟器用得比较多。兼容armeabi

(5)x86_64: 64位的平板。兼容armeabi

(6)mips / mips64: 极少用于手机可以忽略 

虽然armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力。armeabi就是针对普通的或旧的armcpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu

所以一般考虑apk的体积,我们只需要添加armeabi架构的so库久可以了,就可以在arm架构和x86架构的手机上运行。

注意,在gradle中设置CPU架构类型的so库时,只需要添加armeabi,其它的一律不要添加,否则打包成apk时,就会在lib中生成相应的CPU架构文件夹,在相应的架构手机下就会去找相应文件夹下的so库,找不到就报错,比如我们还添加了armeabi-v7a,在armeabi-v7a手机上运行就会去armeabi-v7a文件夹下寻找相应的so,找不到就会报UnsatisfiedLinkError错误。如果我们不加armeabi-v7a等其他架构,只添加'armeabi'架构,在armeabi-v7a等手机上运行,就会去找lib下的'armeabi-v7a'文件夹,这时该文件夹并不存在,它就会去armeabi文件夹下找相应的so(文件夹存在就不会去找armeabi),就不会存在找不到so库尔报错。arm架构是向下兼容的,armeabi-v7a兼容armeabi,arm64-v8a兼容armeabi-v7a。

ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi'
            //  'armeabi-v7a', 'arm64-v8a','x86', 'x86_64', 'mips', 'mips64'
        }
           

有关C调用libjpeg库的代码进行压缩文章:https://www.jianshu.com/p/eebe2107da6d

后续

添加了 armeabi-v7a, arm64-v8a 架构的支持,因为在八月份Google Play会强制要求Play上架的新应用和已有应用的更新必须包含原生64位版本,否则会被下架。

app下的build.gradle修改如下

ndk {
            // 这里面指定的是 cpu 的架构
            abiFilters 'armeabi-v7a','arm64-v8a'
        }
           

项目Demo