Android NDK开发之CMake

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyl826/article/details/83893209

知之为知之,不知为不知

哇!(先来个王者之哇助助兴),最近的项目一直用到Android NDK,简直头皮发麻,每次底层出现问题,都要找同事帮忙,甚是尴尬,于是看一些帖子,稍微整理了一下,做个小笔记,同时也分享一下前人之经验.不说了,开始进入正题.

Android开发环境

工具:Android Studio 3.0.1

开发jni工具 : CMake

要使用CMake进行jni开发,需要一下环境配置(假设你已配置好sdk): 

第一:下载相关插件

打开Android studio --- >  Setting --- > Appearance Behavior --- > System Setting --- > Android SDK --- >SDK Tools

勾选Cmake 、LLDB、Android SDK Platform-Tools、Android SDK、NDK、Support Repository(子选项全勾上),点击OK;

第二:配置ndk路径

打开Project Structure(使用快捷键Ctrl + Shift +A搜索 或 使用工具栏打开都可以),配置Android NDK location

使用形式:

分为两种情况 :

第一种: 新建项目时,我已经知道 项目肯定要使用NDK编程,与C或者C++进行交互

第二种:项目都已经开始一段时间了,突然告知项目要与C或C++进行交互,使用NDK编程.(瞬间头发掉了一大片)

使用细节:

第一种:新建项目时部署

第一步:创建项目时,勾选Include C++ Support

第二步:根据需要 选择C++ Standard(C++标准),一般没有什么特殊支持,默认就好

第三步:项目创建成功后,运行项目出现 : Hello from C++

             cpp目录的作用  : 放置项目所有原生源文件等构件库;

             External Build File 作用: 放置CMake 或 ndk-build 的构建脚本,当前为CMakeLists.txt               

第四步:在MainActivity中新增一个本地方法,例如: public native String getStr(); 使用快捷键Alt + Enter选择 Create ,

studio工具会在native-lib.cpp文件中生成方法的实现,在对应的方法中写入自己需要获取的信息即可.

如果写入的语法以及参数获取正常,正常运行可以获取到从native层返回的参数.

第二种:项目开发过程中加入Cmake

第一步:在工程模块下新建一个CMakeLists.txt文件(最好从新建以项目直接复制过来一个CMakeLists.txt修改)

修改其中的add_library(配置 库名)      SHARED (生成动态库)   资源文件(例如 src/main/jni/ JniTest.c)

如果需要在c++中打印日志,需要配置find_library 与 target+link_library (加入库名与add library保持一致)

第二步:切换到Android视图模式下,点击右键,选择Link C++ Project with Gradle , 配置CMakeLists.txt的路径,点击OK;

第三步: 在build.gradle(app)下,defaultConfig闭包内,加入:

externalNativeBuild {
    cmake {
        cppFlags ""   (如果使用 C++11 标准,则改为 "-std=c++11" )
        abiFilters 'armeabi-v7a','x86'  (生成.so库的目标平台)
    }
}

第四步: 新建Java(JniTest)类,用于声明本地方法和加载动态库,对于新建的本地方法报红,直接Ctrl + Enter 选Create即可;

然后在 JniTest中就会生成相对应的jni方法

注意点1: 如果 快捷键没有出现create ,那说明 .java类的名称与 .c文件名称不一致, 修改一致就可以快捷键生成.

注意点2: 修改.c文件名时,切记对应将 CMakeLists中的名称也进行修改.

第五步: 在jni方法中修改需要返回的数据,在MainActivity中进行尝试性调用即可.

猜你喜欢

转载自blog.csdn.net/xyl826/article/details/83893209