手把手教你生成自己的图片压缩的so库

       最近安卓开发里面最火的是什么?NDK开发啊,之前面试的时候好几家公司都问我会不会这个,或者直接就出了这样类型的笔试题,当时的我也是一脸懵逼。恰好这段时间研究了图片压缩和视频压缩的NDK开发,话不多说,开干吧!

      以往的图片压缩大家都知道无非是进行图片质量压缩和按比例压缩,但是这样不靠谱啊,压缩严重点直接就趋于马赛克(可能有点夸张)了,好伐。于是libjpeg就登场了,具体为啥,我就不说了,请看上一篇的英文介绍,而且网上一大片相同的原因介绍。今天我主要讲的是生成自己的libjpeg.so库:

     

     一、安装NDK(硬件环境:Win10 x86, 开发工具:Android Studio)

     打开android Studio的Project Structure,在Android NDK Location 填入你的NDK路径,比如我的是——D:\Android\sdk\ndk-bundle。如果你的电脑里面没有下载NDK,那应该有个Download的按钮,直接下载最新的NDK即可。

     打开环境变量,在系统变量里面新增“NDK_ROOT”,把你的NDK路径填进去,然后保存之后在用户变量为“Path”的变量里面增加“%NDK_ROOT%。

      检查NDK是否安装成功,成功的提示如下图:

      

     失败的话就会提示“ndk-build不是内部命令”。

      二、编译过程

      1、先新建一个Android Project,然后在下面的网址,也就是https://github.com/bither/bither-android-lib,下载该项目并解压缩,之后会出现一个名为“libjpeg-turbo-android”的文件夹。把这个文件夹的名称改为“jni”,扔进我们的app目录下即可,如下图所示:


      2、按照上图中从上至下的步骤,先是打开cmd,cd到这个对应的文件夹目录下,例如我的就是“

E:\PhotoCompress\app\jni\libjpeg-turbo\jni ”,接着输入命令“ ndk-build APP_ABI=armeabi,armeabi-v7a ”运行,当然你也可以只输入“ndk-build”运行,但那样只会得到armeabi文件夹下的so库。另外如果你出现一个关于“APP_PLATFORM”设置的警告,只需要在命令行的后面加上一个空格和一句"APP_PLATFORM=14",然后运行就可以了。编译完成后在这个项目下的libs文件夹会生成相应的文件夹armeabi和armeabi-v7a,里面分别有一个我们需要的“libjpegbither.so”的文件。当然如果你想给这个so库换个名称也是可以的,直接在我们编译的这个jni文件下找到一个Android.mk的文件,然后打开并查找名称为“ libjpegbither”并全部修改成你要的名称即可,因为这个名称基本都是这样的,而LOCAL_SHARED_LIBRARIES就是指我们要生成一个或多个的静态库。

    3、在app的jni文件下,找到一个名为“use-libjpeg-turbo-android”的文件夹,打开之后你会发现里面也有一个“jni”的文件夹,把我们之前生成的那两个文件夹放入这个“jni”文件夹中,如下图所示:

(1)cd到图中蓝色背景的这个jni文件夹,输入“ndk-build APP_ABI=armeabi,armeabi-v7a”命令进行编译,然后我们会在“.../use-libjpeg-turbo-android/libs”目录下得到两个和之前一样名称的文件夹,每个文件下会有两个我们自己想要的so库——libbitherjni.so和libjpegbither.so

(2)把生成的so库放进我们需要用到的工程里面,对应新建相关的包名类名和方法名,也就是net.bither.util包下的NativeUtil类中的compressBitmap方法,参数也一定要对应上。

(3)在NativeUtil类中加上下面的引用,然后我们就可以调用相应的图片压缩方法了。

static {
    System.loadLibrary("bitherjni");
    System.loadLibrary("jpegbither");
}
 
 (4)最后,关键的要来了,因为是要生成自己的so库,但很多时候大家的项目包名甚至图片压缩工具类名都已经是确定的了,不愿意再加上上面这个包名,这时候只需要在进行我们的步骤(1)的时候,先在路径“.../use-libjpeg-turbo-android/jni”下找到一个名为“bitherlibjni.c”的文件,在这个文件中会有如下图的一段代码: 
 


其中net_bither_util就对应着包名net.bither.util,NativeUtil对应着工具类名,compressBitmap对应着方法名。可以根据项目的需要进行修改,比如我的包名是com.sherry.photocompress,在ImageUtil工具类中调用方法compressBitmap进行图片压缩,那就可以直接把上面这个方法改为com_sherry_photocompress_ImageUtil_compressBitmap,然后再进行后面的编译操作。


好的,我的图片压缩生成相关so库的教程到这里就结束了,后续会附上自己图片压缩相关的全部代码和对应打包成功的so库。图方便的话,可以直接修改上面那个包名和方法名,然后在项目里面使用,不过还是建议大家自己玩一遍。



猜你喜欢

转载自blog.csdn.net/shan286/article/details/74801416
今日推荐