Android Studio 3.0.1
SDK Tools中安装SDK版本:16.1
安装:LLDB,c/c++调试器
安装:CMake 编译C/C++生成.so的构建工具
在Greate Android Project时勾选Include C++ support
在Customize C++ Support时选择默认的Toolchain Default
会自动生成两个文件
cpp/native-lib.cpp cpp目录是放置c/c++代码
CMakeLists.txt:cmake插件的配置文件,用来指导c/c++如何编译成so文件
在eclipse中是用Android.mk来配置的
官方主推:CMake + CMakeLists.txt来构建库
1)定义库的名称,类型及要编译的源代码
add_library( # 编译生成的库的名称,最终会在前面加上lib libnative-lib.so
native-lib
# 生成的库的类型,有SHARED,STATIC,MODULE
SHARED
# 要编译的源代码文件多个文件用空格分开
src/main/cpp/native-lib.cpp )
2)包含要编译源码的头文件
# 注意这里指定的是头文件的目录
include_directories(src/main/cpp/include/)
3)使用NDK里的api,链接动态预编译好的库
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
#链接到native-lib库中
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
在编译运行项目后在project视图下可以看到在build下多了一个android-profile目录
profile-xxxx.json编译的版本信息
运行后在TextView中出现Hello from C++
以上是模板生成的
生成的库文件在
./app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
./app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
同样的程序代码为了兼容不同的CPU,需要为不同的ABI构建不同的库文件
armeabi设备只兼容armeabi;
armeabi-v7a设备兼容armeabi-v7a、armeabi;
arm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabi;
X86设备兼容X86、armeabi;
X86_64设备兼容X86_64、X86、armeabi;
mips64设备兼容mips64、mips;
mips只兼容mips;
1)MathTool.java 在java文件中建立native方法和加载库
public class MathTool {
static {
System.loadLibrary("math-lib");
}
public static native int add(int i, int j);
public static native int sub(int i, int j);
}
通过alt+enter键在native-lib.cpp中自动生对应的方法使编译能通过
2)native-lib.cpp
extern "C"
JNIEXPORT jint JNICALL
Java_com_bshui_ndktest_MathTool_add(JNIEnv *env, jclass type, jint i, jint j) {
//实现相关的代码
return i+j;
}extern "C"
JNIEXPORT jint JNICALL
Java_com_bshui_ndktest_MathTool_sub(JNIEnv *env, jclass type, jint i, jint j) {
jint ret = 0;
ret = i-j;
return ret;
}
3)修改CMakeLIsts.txt
add_library( # Sets the name of the library.
math-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
target_link_libraries( # Specifies the target library.
math-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
4)Android 应用测试引用
TextView tv = (TextView) findViewById(R.id.sample_text);
int sum,sub;
sum = MathTool.add(5,10);
sub = MathTool.sub(5,10);
tv.setText("sum(5,10)="+sum+" sub(5,10)="+sub);
只需提供.so和.jar
1)在libs目录下新建arm64-v8a把对应的libmath-lib.so导入
2)把classes.jar放入libs目录下
导出class.jar, 原工程New Module-->Android Library
注意包名为com.bshui.ndktest,与生成native的java同包名
编译后生成class.jar包
3)build.gradle app的android中加入
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
4)在工程中调用api
tv = (TextView)findViewById(R.id.tv);
int sum = MathTool.add(10,20);
int sub = MathTool.sub(20,10);
tv.setText("sum(10,20)="+sum+" sub(20,10)="+sub);