知之为知之,不知为不知
哇!(先来个王者之哇助助兴),最近的项目一直用到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中进行尝试性调用即可.