介绍
1、NDK
NDK是Native Development Kit的缩写,它不是一个单独的工具,而是一个包含API、交叉编译器、链接程序、调试工具、构建工具、文档和示例等的综合工具。它的作用是快速开发C/C++动态库,并自动将动态库和应用打包到apk中。
2、JNI
JNI是Java Native Interface的缩写,即Java 本地接口,作用是Java 跟本地其他语言(C/C++)进行交互。
示例
1、环境
-w100打开Tool-SDK Manager,选择Android SDK,下载上面红色框响应的资源。
【LLDB】:C/C++的调试工具
【CMake】:跨平台的编译工具
【NDK】:开发需要用到的工具集
2、工程创建
Android Studio已经支持在创建工程的时候,就支持NDK的相关能力。
-w1012
点击“New Project”,选择“Native C++”,其他的默认即可,这样子AS就能够创建一个通用的包含NDK能力的工程。
-w1552
跟普通工程的差别,就是新增加了上面左边的几个文件/夹,并且在build.gradle新增了相关配置。
这里介绍一下调用的流程和相关文件的作用。
- MainActivity
public class MainActivity extends Activity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());}
public native String stringFromJNI();
}
在MainActivity类开始加载的时候,先执行静态代码块的内容,System.loadLibrary("native-lib");
是加载一个名字为"native-lib"的so文件。在文件的最底下,public native String stringFromJNI();
声明了一个名称为"stringFromJni"的方法,其中"native"是对应的关键字。
- CMakeList.txt
NDK开发的相关配置。各个命令相关的含义如下:
# 设置cmake使用的最低版本,如果用到了高版本的特性,
#这里需要进行设置,如果没有,也可以忽略不写。
cmake_minimum_required(VERSION 3.4.1)
#第一个参数 创建一个名称为 native-lib 的动态库,会生成 native-lib.so 文件;
#第二个参数 SHARED 的意思是声明这个库为动态库,另外一种是静态库,STATIC 表示。
#第三个参数是指定这个库使用到的源代码文件
#另,可以使用多个 add_library,来构建更多的库文件。
add_library(native-lib SHARED native-lib.cpp)
# 查找名字为log 的 NDK库,将这个库的路径存储在变量中。
# 这里的意思就是找到 NDK 中的 log 库,并将其路径存储在 “log-lib” 变量中,
# 在后面就可以通过 “${log-lib}” 命令取出变量中的值
find_library(log-lib log)
#将我们的so 库和 log 库链接起来
target_link_libraries(native-lib ${log-lib})
- native-lib.app
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_canter_ndkdemo1_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
native方法的实现,在java调用的stringFromJni最终会执行到这里,并返回对应的数据。
- build.gradle
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
指定CMakeLists的位置,将NDK和gradle关联起来。
3、运行
-w300执行 "RUN"操作之后,应用程序就能够从so中获取对应的数据进行展示了。整个执行流程:
1、gradle按照我们配置的路径,调用执行cmakelist.txt脚本
2、cmake按照配置,将源文件编译到共享库中,并命名为libnative-lib.so,之后一并打包到apk中;
3、在运行的时候,首先执行静态代码块的内容,加载对应的so.
4、调用对应的jni方法,so里面的实现就会返回对应的数据给到JAVA层,进行展示。
网友评论