为什么要用cmake?我先说一下cmake的优点:
1.配置简单,只需要一个text文件几句代码即可完成Jni环境配置
2.请看下图:
第一张图是在干什么?debug C/C++代码啊!惊不惊险刺不刺激?!
都能够直接debug了,添加文件添加函数肯定超简单的。
第二张图片呢,查看了一下apk包里面的内容可以看到所有c/c++代码都会自动被编译成为so库文件才能发布,java代码再混淆有so库安全?
所以说cmake还是很好用的,毕竟官方推荐的。
开始配置:
找一个普通AS项目,也可以新建一个不用选C++支持,添加ndk及相关库,File->Settings:
如图:添加CMake,LLDB(这个库是debugC/C++代码时用的),NDK保存等待安装完毕。
在app目录里面新建一个CMakelists.text文件,注意名称,添加如下代码:
cmake_minimum_required(VERSION 3.4.1)
include_directories(
${CMAKE_SOURCE_DIR}/src/main/cpp/include #h文件目录
)
add_library( # Sets the name of the library.
jni-lib #c/cpp代码将要编译成为so库的名称,java代码加载库文件要用这个名称
SHARED
src/main/cpp/hello-cjni.c #c代码文件路径
src/main/cpp/hello-cppjni.cpp #cpp代码文件路径 这里可以随意添加c、c++文件
)
target_link_libraries( # Specifies the target library.
jni-lib
)
所以可以看出以后要往项目当中添加c、cpp文件就需要来cmakelists文件当中进行添加设置。
然后把这个cmake配置文件配置到AS当中:
在app:build.gradle 的android 里面添加:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
配置好长这个样子:
到此工程配置就完成了。下面使用:
src/main/cpp/ 在这个路径下面新建两个文件:
一个:hello-cjni.c 一个:hello-cppjni.cpp 文件名称和路径跟cmakelist里面的对应。
新建JniNative.java文件,作为java与c代码解耦类建好以后AS长这个样子:
说明一点:如果新建了c文件但是AS当中看不到则说明没有在cmakelist里面配置好或者还没有执行cmakelist文件:
在JniNativ.java里面添加如下代码:
“jni-lib”这个名字是跟cmakelist里面的target_link_libraries里面的名字是对应的。添加四个方法分别在c/cpp里面算加减并返回结果。
在c文件当中添加如下代码:
在cpp文件当中添加如下代码:
看出来区别没,相差一个extern “C”,这个的作用网上很多就不说了。
其中:
最后调用c、c++代码,在MainActivity里面:
最后检查一下整个代码,包括三个地方,c/cpp当中,JniNative当中,MainActivity当中,都没有问题就可以运行了。
运行结果,其中有分别在c文件和cpp文件当中的运行结果:
总结:添加c当中的调用方法需要修改c,JniNative,MainActivity三个地方,要添加c/cpp文件需要修改makelists文件即可。