安卓native项目,接入sdk的时候,当第三方库中包含.so文件,我们把.so文件放到安卓工程的armeabi,armeabi-v7a 等文件夹下面的时候,然后再运行该项目,编译的时候,是会删掉对应的.so文件,然后重新生存.so文件的,此时就会删掉我们刚刚复制的.so文件,如果直接用eclipse开发,倒是有一个方法,就是在打包的时候(此时只涉及到安卓层的东西,不会涉及到c++层的东西,我们只需要把第三方.so拷贝到对应的平台文件夹下,然后找到工程,然后找到编译属性,把那个编译c++/c部分关闭,意味着工程不会删除.so,在执行run as 的时候,就不会删掉.so文件了,这个也是我以前一直用的方法,多平台的就把各个平台给的.so文件依次复制下去就是了)但是这样未免有些繁琐,我们需要的是一劳永逸的方法,通过摸索,找资料,得到解决方案如下:
1:复制.so文件
找到项目工程的jni文件夹,发现里面会有一个android.mk 和一个application.mk文件 假若我们现在要引入的第三方库是third.so,在jni里面新建一个文件夹,命名随便,我们命名为prebuilt 然后我们打开application.mk文件,找到关键字APP_ABI(代表该工程需编译什么版本的.so库,不懂可以百度,没有找到该关键字表示工程用的是默认的armeabi),假若我们找到这样的一条语句:APP_ABI:= armeabi-v7a x86 那么我们回到prebuilt文件夹下面创建对应的两个文件夹,然后再到对应的两个文件夹里面复制好第三方给的对应的.so文件(一般第三方给的.so文件,都会有几个版本),这个是第一步,做好资源的复制。
2:修改android.mk
打开android.mk文件,在LOCAL_PATH := $(call my-dir)添加下面语句:
###add the third .so start
include $(CLEAR_VARS)
LOCAL_MODULE := thirdSo
LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/third.so ###这个是关键语句,TARGET_ARCH_ABI表示当前平台 就是对应之前建立的文件夹
include $(PREBUILT_SHARED_LIBRARY)
###add the third .so end
这样一来就会复制.so到对应的文件夹下面,打包的时候,就没问题了。
好的,问题解决了,我们需要了解一下armeabi armeabi-v7a x86等是什么意思呢。我的理解就是手机的cpu类型,一般我们的android工程用的就是默认的也是兼容性最强的armeabi,但是为什么我们还要用armeabi-v7a x86呢,我认为是为了发挥更好的手机处理器的优势吧。但是这样会有一个问题,就是当我们的工程用了多各个版本后,ndk在编译的时候,会生成各个版本的.so文件,那么apk包是要大一些的。总之,性能和包的大小,就要看实际情况了。利用中午休息时间写的,有错别字还望见谅。