背景:android studio上需要使用别的同事用linux下(c++写)编译好的的so库,注意不是用c++源码放在android studio上编译;
实现原理:android studio实现JNI规范的接口,再用这套接口去调用linux下编好的so库,这个需要linux调用NDK中的交叉编译工具链进行交叉编译生成so库;
步骤:
1.NDK安装在linux环境上(ubuntu 14.04 64位系统)
通常下载r17(包括该版本)以下的版本,因为r18以上的版本gcc/g++已被改动成clang(我也不明白怎么用)。
在此我用的是别的网友提供的NDKhttps://dl.google.com/android/repository/android-ndk-r17-beta2-linux-x86_64.zip 下载到自建目录/opt/
#mkdir /opt/
#cd /opt/
#unzip android-ndk-r17-beta2-linux-x86_64.zip //解压
#vim /etc/profile
在最后加上
export NDK=/opt/android-ndk-r17-beta2
export PATH=
P
A
T
H
:
PATH:
PATH:NDK
保存后退出,执行
#source /etc/profile
检查是否安装成功:
#ndk-build -v
2.写一个脚本build_so.sh,内容如下,把内容复制粘贴到build_so.sh即可。(脚本内容如下,我的测试代码是c++,所以用g++交叉编译工具链,如果是c代码,应该你也懂怎么改)
其中 -I /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/stlport/ 是为了解决cpp文件中含#include 等头文件不能生成库的问题;
#!/bin/bash
#export NDK_GCC=/opt/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
export NDK_GCC=/opt/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
export HO="–sysroot=/opt/android-ndk-r17-beta2/platforms/android-21/arch-arm -isystem /opt/android-ndk-r17-beta2/sysroot/usr/include -isystem /opt/android-ndk-r17-beta2/sysroot/usr/include/arm-linux-androideabi"
export NDK_STL="-I /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/stlport /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/libs/armeabi-v7a/libstlport_static.a"
$NDK_GCC $HO -shared -fPIC add.cpp -o libadd.so $NDK_STL
3.在脚本的同目录,写个测试的程序add.cpp,内容如下(复制粘贴即可):
extern “C”
int add(int a, int b)
{
return (a + b);
}
4.执行build_so.sh即可生成libadd.so,此时libadd.so准备被android studio调用;
=下边是android studio如何调用动态库部分===========
5.创建带JNI功能的android studio新工程,具体参考《ubuntu下AndroidStudio快速搭建JNI》
6.创建jniLibs目录,添加libadd.so。修改native-lib.cpp,添加add的声明以及JNI的实现,注意声明一定要放在实现前!
7.修改CMake,添加下图红框部分
8.修改MainActivity,添加红框部分
9.修改build.gradle,添加红框部分
10.正常运行后,logcat打印
参考链接:
1.交叉编译-生成动态库在AndroidStudio中使用https://www.jianshu.com/p/5200e59ce9b9
2.NDK在Linux下载配置以及C、C++编译配置(交叉编译)https://www.jianshu.com/p/30e040468721