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++的项目
创建支持原生代码的项目与创建任何其他 Android Studio 项目类似,不过前者还需要额外几个步骤:
  1. 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框(图1)。
  2. 点击 Next
  3. 正常填写所有其他字段并完成向导接下来的几个部分。
  4. 在向导的 Customize C++ Support 部分(图2),您可以使用下列选项自定义项目:
    1. C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
    2. Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake(图3)。
    3. Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake(图3)。
  5. 点击 FinishAS会自动生成带有cpp和mk文件的Demo,最终项目结构如如4。
JNI和NDK简单使用笔记JNI和NDK简单使用笔记

JNI和NDK简单使用笔记



JNI和NDK简单使用笔记
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用来指定原生库文件信息
JNI和NDK简单使用笔记
3.手动配置build文件,主要提供指向CMake或者ndk-build脚本文件的路径,用于将Gradle关联到原生库
要点:
    • 如图6添加路径
    • 如图7添加NDK可选配置
JNI和NDK简单使用笔记

JNI和NDK简单使用笔记

JNI和NDK简单使用笔记

3.其它
  • 使用 add_library() 向您的 CMake 构建脚本添加源文件或库时,Android Studio 还会在您同步项目后在 Project 视图下显示关联的标头文件。不过,为了确保 CMake 可以在编译时定位您的标头文件,您需要将 include_directories() 命令添加到 CMake 构建脚本中并指定标头的路径(图8)
JNI和NDK简单使用笔记
  • 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

参考文章: