体验Cmake,实现c/c++与java之间的相互调用。
Cmake :cmake是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包与一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进 行控制。现在许多跨平台的开源软件都转向了用cmake来做构建工具,如KDE,Kdevelop,hypertable等,使用cmake,你可以不用关心如何去创建编译可执行文 件和动态库。它为了支持不同的平台,提供了以下特性:跨库依赖检查,并行构建和简单的头文件结构,这使它大大减少了跨平台软件的开发和维护过程的复杂性。 (简单来说就是把我们之前jni/ndk开发的流程简化了)。
Jni :JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI, 可以调用用其他语言写成的库或程序,尤其是C和C++。
Ndk :全称 Native Development Kit(为了实现JNI的一种开发工具), 允许你在 Android 应用中使用 C 或 C++ 代码,NDK 可以生成 .so 文件。 优点:1.方便代码共享 2.增加反编译的难度 3.提高性能
(ps:Camke的使用兼容Android Studio 2.2以上的版本)
- 1.下载ndk,cmake
- 2.配置ndk
- 3.配置环境变量
可以看到有一个复选框是Include C++ Support。选中它,一路向下之后工程就创建好了。可以看到我们的工程目录如下:
有三个地方需要注意,第一个是.externalNativeBuild,第二个是cpp文件夹,第三个是CMakeLists.txt文件。
1. .externalNativeBuild文件夹:cmake编译好的文件, 显示支持的各种硬件等信息。系统生成。
2. cpp文件夹:存放C/C++代码文件,native-lib.cpp文件是默认生成的,可更改。需要自己编写。
3. CMakeLists.txt文件:CMake脚本配置的文件。需要自己配置编写。
介绍CMakeLists.txt文件里面的配置属性:
** cmake_minimum_required(VERSION 3.4.1)
CMake最小版本使用的是3.4.1。
** add_library()
配置so库信息(为当前脚本文件添加库(包含自定义的c/c++文件、第三方.so文件))
add_library
(
native-lib(c/c++文件名称)
SHARED (这个参数表示共享so库文件,详细资料看:([C++静态库与动态库](http://www.cnblogs.com/skynet/p/3372855.html))
src/main/cpp/testc-lib.c (c/c++文件路径)
)
** find_library()
这个方法与我们要创建的so库无关而是使用NDK的Apis或者库,
默认情况下Android平台集成了很多NDK库文件,所以这些文件是没有必要打包到apk里面去的。
直接声明想要使用的库名称即可(猜测:貌似是在Sytem/libs目录下)。
在这里不需要指定库的路径,因为这个路径已经是CMake路径搜索的一部分。
** target_link_libraries()
如果你本地的库(native-lib)想要调用log库的方法,那么就需要配置这个属性,意思是把NDK库关联到本地库。
** set_target_properties()
使用第三方so库需要设置的属性 :
set_target_properties
(
imported-lib // so库的名称
PROPERTIES IMPORTED_LOCATION // import so库
libs/libimported-lib.so // so库路径
)
如果打开了上图的路径没有发现cmake文件夹,同make project一下就出来:
* 1.创建java文件(初始化jni功能):
* 2.创建对应的testc-lib.c文件编写代码,并且在CMakeLists.txt文件中配置。
* 3. 创建对象,并且调用自定义的native方法(ps:有点不理解,c/c++调用java 还是先要java调用c/c++,再调用java,不是没事找是干吗?)
以上简单介绍cmake中 c/c++与java相互调用的实现。
http://www.chenglong.ren/2017/01/24/android%E4%B8%ADjni%E7%9A%84%E4%BD%BF%E7%94%A8/