项目开发中遇到一个视频不能上传的问题,使用的是腾讯云里面提供的小视频的第三方SDK。我的手机是华为荣耀7,最终问题定位的是 “Didn't find class "com.tencent.sha1utils.TXSHA1" ”,说是在arm和armeabi-v7a里面没有找到对应的类,根据以前的解决方式推测是缺少对应的so文件,但是只知道引入第三方库的时候需要在libs或jniLibs文件夹里面添加对应的so文件,但是不知道它是什么,所以现在想了解一下。


       网上搜索的资料说so文件是一个二进制文件,由C语言或C++语言开发。二进制文件是机器识别的文件,不需要编译就可在CPU内执行。那为什么在Android开发时需要使用so文件那,这是因为在应用开发时Java语言并不能满足所有的开发需求,所以当遇到Java语言不能满足的需求时,就需要使用so文件来满足对应的需求。Android本身提供了对so文件支持的接口,通过调用Android提供的System.loadLibrary()或者System.load()就可以在JNI层运行so库里面的代码,进而为Android应用提供C/C++实现的功能。


       其次说下为什么需要为不同CPU架构的手机提供不同的so文件。


       Android包管理器安装APK时,如果在对应的lib/ABI(应用程序二进制接口 Application Binary Interface) 目录中存在so文件的话,会自动选择APK包中为对应系统ABI预编译好的so文件。这个ABI又是什么那,ABI翻译过来就是应用程序二进制接口,它定义了二进制文件如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。这里有必要说下指令集的含义,因为通过它才能引申出Android手机支持的CPU架构的慨念。CPU简称中央处理器,是负责计算机主要运算任务的组件。当CPU执行计算任务时都需要遵从一定的规范,程序在被执行前都需要先翻译为CPU可以理解的语言,这种语言或规范就是指令集(ISA,  Instruction Set Architecture)。程序被按照某种指令集规范翻译为CPU可识别的底层代码的过程叫做编译。x86、ARM v8、MIPS都是指令集的代号。Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起), 每一种都关联着一个相应的ABI。所以为了防止出现崩溃和实现功能的完整性需要为不同CPU架构的手机提供不同ABI的so文件。


       总结:


       so库的引入就是为了弥补开发Android应用时Java语言不能满足需求的情况,比如加解密算法,音视频编解码等。它是由C/C++语言开发的二进制文件,可以直接运行在手机CPU上面,又因为现在Android手机支持好几种CPU的架构,每一种架构都有自己的ABI,所以在开发时需要提供多个so包,防止出现崩溃或者功能不能实现的问题。