问题1: 使用NDK编译第三方库问题
使用NDK编译第三方库一般要指定如下:
#配置环境变量,后面的arm-linux-androideabi-gcc就会去这里面找
export PATH="$NDK_DIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/:$PATH"
#配置系统库lib和头文件
export SYS_ROOT="$NDK_DIR/platforms/android-8/arch-arm/"
#CC配置gcc编译器,指定系统的库和头文件目录, -march指定编译允许架构,armv7-a armv8-a
export CC="arm-linux-androideabi-gcc --sysroot=$SYS_ROOT -march=armv7-a -mfloat-abi=softfp"
# 配置链接器
export LD="arm-linux-androideabi-ld"
export AR="arm-linux-androideabi-ar"
export RANLIB="arm-linux-androideabi-ranlib"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="-mfpu=neon -mfloat-abi=softfp -O3 -fPIC -ldl"
通常,配置好后,执行开源软件的configure配置makefile,然后执行make和make install即可编译出第三方库的so;
但是、但是,往往会出现上面的CC和SYS_ROOT配置的文件不存在,
No such files;
为什么了?why?
原因在于从NDK16版本开始,不在使用gcc编译工具了,而使用clang编译,所以相关的文件目录已经变了,如
CC配置的编译器clang位于以下目录,LD、AR、RANLIB和STRIP都在下面这个目录可以找到:
ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin
注意:在选择clang编译器时,要根据配置的-march不同而不同
SYS_ROOT配置的系统库位于:
ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\sysroot
这样,基本上就能解决No such file的问题;现在网上很多的NDK编译demo,都是用的老版本NDK,照例抄下来不能运行往往都是这个问题
问题2:
起初以为android studio的Ndk开发和eclipse一样,在命令行使用命令: $NDK/ndk-build进行编译生成,后来才发现这样不可以,及时你使用这种方法编译出so文件了,最终android studio编译的时候也会重新去生成so文件,android studio的ndk用着还是挺方便的,就是前期你得自己配置gradle,如果你不配置很可能报错,说你的ndk废弃了deprecated;因为studio默认一个版本的sdk对应一个版本的ndk,如果着两者不匹配,就会报这个错;下面就是讲解配置这个ndk和解决这个问题:
1. 设置ndk路径
2. 如果你的sdk和ndk版本不匹配,需要在gradle里面配置使用废弃deprecated的ndk
3. 在gradle里面配置ndk参数;
最后,你的ndk就可以使用了,编译下载就会成功执行了。