JNI和NDK简单使用笔记
JNI理解
Java Native Interface(Java本地接口),是用来实现Java和C/C++的互相调用的桥梁。实际中驱动都是同个C/C++开发而来的,通过JNI,Java代码可以很快捷的调用C/C++的驱动,扩展Java虚拟机的能力,弥补Java在不够高效的缺陷,C/C++在数学运算、游戏、音视频编码解码方面比Java高效很多。
NDK理解
Native Development Kit,是Android提供的一个工具集,用以方便的使用JNI调用C/C++代码,NDK提供了交叉编译器,开发时只需要修改mk文件就能生成适用于特定CPU平台的动态库。
JNI的一般开发步骤:
1.创建支持C/C++的项目
- 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框(图1)。
- 点击 Next。
- 正常填写所有其他字段并完成向导接下来的几个部分。
-
在向导的 Customize C++ Support 部分(图2),您可以使用下列选项自定义项目:
- C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
- Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake(图3)。
- Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake(图3)。
- 点击 Finish,AS会自动生成带有cpp和mk文件的Demo,最终项目结构如如4。
2.向已有项目中添加NDK支持
1.创建新的原生(C/C++)文件并添加到现有项目中
要点:
- 文件的位置在哪里都可以,主要和Cmake文件的编辑有关
- 可以支持Java方法调用的原生代码方法命名有要求,必须是Java+包名+Class名称+方法名,用下划线分割如图5,该名称与System.loadLibrary()文件所在目录相关
2.创建CMake构建脚本文件,并放到与build.gradle同级目录中,方便配置build
要点:
- 文件名称必须是CMakeLists
- 主要添加cmake_minimum_required和add_library方法,cmake_minimum_required用来指定编译库最低版本,add_library用来指定原生库文件信息
3.手动配置build文件,主要提供指向CMake或者ndk-build脚本文件的路径,用于将Gradle关联到原生库
要点:
- 如图6添加路径
- 如图7添加NDK可选配置
3.其它
- 使用 add_library() 向您的 CMake 构建脚本添加源文件或库时,Android Studio 还会在您同步项目后在 Project 视图下显示关联的标头文件。不过,为了确保 CMake 可以在编译时定位您的标头文件,您需要将 include_directories() 命令添加到 CMake 构建脚本中并指定标头的路径(图8)
- CMake使用lib+库名称.so来命名动态库并打包到Apk文件中,但是在Java加载时还是使用Cmake构建脚本中的指定的名称如System.loadLibrary("native-lib"),而不是使用libnative-lib
- 更多配置见http://www.cnblogs.com/mingfeng002/p/6775145.html
自己写的测试例子:https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
https://github.com/aifeier/NDKDemo.git
参考文章: