目录
环境信息
NDK是什么
JNI是什么
如何进行NDK开发
总结两点
创建工具
进行具体操作
第一步: 进行NDK开发的当然是下载NDK开发包 ,并在项目中配置好
第二步: 新建Java类,编写 native 方法
第三步: 根据新建的java类,生成 .h 头文件(javah)
第四步: 根据生成的.h文件生成 .so文件(ndk-build)
第五步: 使用生成的SO库
第六步 结束总结
AndroidStudio 3.4.1 JDK1.8.211 运行与Android7.1 (项目本身不需要申请权限)
NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用:
JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++进行交互。
想了解详情请参考谷歌官方NDK开发指南 https://developer.android.google.cn/ndk/guides
1. 将 java 文件转换为 .h 头文件
2. 创建C/C++文件将头文件引入,重新方法。再编译成 静态链接库(.a)或者动态链接库 (.so)
上述第一步使用工具是 JDK中的 javah 命令 ,生成.h文件
上述第二步使用工具是NDK中的 ndk-build 命令,编译成库
为了便于以后使用,我直接配置在Android Studio 的工具里 : Settings ——> Tools ——>External Tools ——>点击 + 号
Program: D:\Software\Java\jdk1.8.0_211\bin\javah.exe (根据自己JDK安装位置修改)
Arguments:-classpath $ModuleFileDir$\src\main\java -jni $FileClass$ (参数最好别改)
Working directory: $ModuleFileDir$\src\main\jni (根据自己想法更改 $ModuleFileDir$ 是项目路径)
设置好以后记得在项目中新建jni文件夹(如果无法找到文件夹会无法执行命令,这一步需要根据自己命令中设置的工作目录来具体分析)
会在命令设置的工作目录中出现 .h 头文件
为了便于以后使用,我直接配置在Android Studio 的工具里 : Settings ——> Tools ——>External Tools ——>点击 + 号
Program: D:\Software\Android\Sdk\ndk-bundle\build\ndk-build.cmd (根据自己NDK安装位置修改)
Arguments:NDK_LIBS_OUT=$ModuleFileDir$\src\main\jniLibs (参数最好别改)
Working directory: $ModuleFileDir$\src\main\jniLibs (根据自己想法更改 $ModuleFileDir$ 是项目路径)
设置好以后记得在项目中新建jniLibs文件夹(如果无法找到文件夹会无法执行命令,需要根据自己命令中设置的工作目录来具体分析)
在jni目录下创建 Android.mk Application.mk 和 .c 或者 .cpp 的 C/C++文件
在实例化 NDKTools 的时候 加载 so库
static { } 静态代码块 :类进行初始化时 第一加载,切只加载一次 (再次实例化 不会再运行)
{ } 代码块 :类进行初始化时 第二加载, 再次实例化 会再运行
类名{} 构造方法 :类进行初始化时 第三加载, 再次实例化 会再运行
1 jniLibs 文件夹是 Android应用调用 C/C++ 默认找的文件夹 ,不需要再build.gradle 里配置了
2 在新建 C/C++文件后 一定要添加 生成的 .h头文件,将头文件里的方法复制到C/C++ 文件里后,
要注意添加 变量名 ,在实现这个方法的时候要注意 C和C++ 在语法上的差别 。
3 在使用Android Studio 里添加的 javah 和 ndk-build 命令时,要注意在创建命令时,填写的
工作目录的文件夹一定要存在。
4 Android.mk Application.mk .h文件 C/C++ 文件 要在同一个文件夹 ,如果不在,需要具体配置
Android.mk 里的文件信息
5 好像无法生成 armeabi cpu 架构的 so库了 (我是没成功)