本文为博主原创文章,转载请标明出处。AndroidStudio 进行 JNI / NDK 开发:初步配置及使用-CSDN博客
java代表java语言,
native代表当前程序运行的本地环境,一般指windows/linux,而这些操作系统都是通过C/C++实现的,所以native通常也指C/C++语言,
interface代表java跟native两者之间的通信接口,
Java Native Interface(Java 本地编程接口),一套编程规范,它提供了若干的 API 实现了 Java 和其他语言的通信(主要是 C/C++)。Java 可以通过 JNI 调用本地的 C/C++ 代码,本地的 C/C++ 代码也可以调用 java 代码。Java 通过 C/C++ 使用本地的代码的一个关键性原因在于 C/C++ 代码的高效性。
Native Development Kit(本地开发工具),一系列工具的集合,提供了一系列的工具,帮助开发者快速开发 C/C++,极大地减轻了开发人员的打包工作。这套工具集允许为 Android 使用 C 和 C++ 代码。
CMake一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果只计划使用 ndk-build,则不需要此组件。
LLDB一种调试程序,Android Studio 使用它来调试原生代码。
AS2.2之前的传统创建方式:(已淘汰)
AS2.2之后的ndk cMake创建方式:见 第三条目
在新建项目时勾上Include C++ support 这行:
在向导的 Customize C++ Support 部分,有下列自定义项目可供选择:
C++ Standard:使用下拉列表选择使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
Exceptions Support:如果希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle文件的 cppFlags中,Gradle 会将其传递到 CMake。
Runtime Type Information Support:如果希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle文件的 cppFlags中,Gradle 会将其传递到 CMake。
主要项目结构目录
cpp 文件夹:用于编写 C/C++代码
CMakeLists.txt:CMake 脚本配置文件
配置 build.gradle 文件
要在哪个类运用 JNI ,就得加载相应的动态库
快速生成代码:Alt + Enter
( 我在kotlin类中创建了一个external函数,如何在native-lib.cpp文件里生成对应关联的函数)
鼠标选中external fun getBytes( bytes:ByteArray):ByteArray ,点击快捷键 Alt+Enter 弹出提示,Create jni function getBytes 就会在native-lib.cpp文件里生成对应的jni 函数
在 native-lib.cpp 中声明后记得在方法名的上面一行添加 extern"C",否则执行后会找不到该方法。
新建 C/C++ 源代码文件fmf_jni.cpp fmf_jni2.cpp,要添加到 CMakeLists.txt 文件中
直接在 .cpp 文件里面加断点 ; debug 运行就好了 ;
第一步,将native-lib. cpp 文件夹下的文件名 修改 为 fmf_jni.cpp
第二步,将此句 System.loadLibrary("native-lib"); 的名字修改 fmf_jni
第三步,将 CMakeLists.txt 文件里面所有 "native-lib" 的字段修改
然后先 Clean Project ,再重新编译一下项目( Ctrl + F9)(点击锤子 不是 Rebuild Project )
找到so文件的位置直接导出来 (E:\Android\NdkDemo\myNativeDemo\app\build\intermediates\cmake\freeMinApi23Debug\obj\arm64-v8a\libfmfjni.so)
你的build.gradle 配置ndk配置几个so类型 就打几个so类型库
创建新源文件(.cpp / .c)
参考新建项目的方式在 src/main 路径下创建 cpp 文件夹 ; (也可在其他目录下创建,在第二点会配置这个路径);
在 cpp 文件夹下创建你的 .cpp / .c 源文件 ;