Android 中的 NDK 开发

android studio 相关说明 | 2018-08-19 00:39

今天又是一个全新的起点 NDK,起点很多了,不急我们一个一个把他们都完成。

今天主要讲一讲 Android 中如何开发 C++,首先我们先熟悉几个平时总能听到,并不陌生似乎还有所了解的几个 java 概念,但是对于我本人有时候还不是很清楚这些概念和用途。

JNI 全称 Java Native Interface,Java 本地化接口,可以通过 JNI 调用系统提供的 API。通过概念我们去掉所有定义,JNI 是接口,然后我们添加内容 提供系统的 API 的接口。因为 Java 无法直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件。

在看今天第二个出场的是 NDK 。NDK是Google开发的一套开发和编译工具集,可以生成动态链接库,主要用于Android的JNI开发。还是先去掉定语,NDK 是工具,什么样的工具,开发和编译 JNI 的工具,但是从字面上看,他不单单可以开发 JNI 好像还有点别的意思。

还有我们在开发过程中一定遇到引用第三方的项目,需要引入一些 os 文件,那么这些 os 文件到底是什么,这里给大家解释解释,其实这些 os 文件是动态库,那么什么是动态库。在解释什么是动态库之前我们先说一说什么是静态库

对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件 (object file)与牵涉到的函数库(library)被链接合成一个可执行文件 (executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件 名为“libxxx.a”的形式。

我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是如雷贯耳的动态链接库(dynamic link library)技术。也就是动态库。

1.动态库把对一些库函数的链接载入推迟到程序运行的时期。

2.可以实现进程之间的资源共享。(因此动态库也称为共享库)

3.可以动态注入到程序中

看一看这个流程图帮助我们理解 JNI 的工作流程。

好我们回到正题上,开始一个 helloworld来结束今天分享。

要使用 Android Studio 的中的 NDK 开发工具,我们需要做一些准备。

首先需要在 SDK 中下载 CMake 和 NDK 的工具包。

然后便可以创建项目了,创建项目时,需要勾选 C++ support,项目创建完成后,就会自动创建一个 cpp 文件夹,并且在其中已经创建好一个 c++ 文件,如下图。

而且我们检查项目配置页面也会看如下图

好了如果没有任何错误提示,我们运行程序就可以在模拟器中看到如下的效果

好接下来呢,先分别看一看 Android studio 自动为我们做了哪些事,才出现如图效果。先打开 MainActivity  看一看与我们创建一个普通 Activity 有什么不同,

这里有一个方法在 public 后面多一个 native 修饰符表示这个方法调用了 c 或 c++ 方法

上面这里 static 表示这个方法来自于那个 native-lib 类

运行一下我们看到这里输出的字符串是由

我们自己用 c 写一个来在屏幕上显示字符串,通过做个demo 我们来了解一些 android 上 java 是如何调用 c/c++ 的方法。

万事开头难

首先我们创建一个 class 命名为 HelloNDK 不错名字吧,然后

然后做两件事,很清晰,第一件事我们创建一方法来调用c的对应方法

方法名自动生成,我们看一下方法名有什么特别的,是怎么组成的呢,

第二件事就是我们指定一下方法来自那个 c/c++ 类。但是现在还没有这个 HelloNDK 的类。我就需要在 cpp 文件夹下创建一个 HelloNDK.c 类

这里方法名称为 java 对应类(HelloNDK)的方法名 sayHelloNDK 通过下划线连接。然后方法返回一个字符串。如上图。工作没有完了,我们需要  CMakeList.txt 文件进行配置一下,要不 gradle 在构建项目时无法识别到这个 c ,想一想一切都是合情合理的。大家在开发时,不要把一些东西想的很神秘,其实一切都是合情合理。

文件人有点乱,通过 # 注释掉我们就不用看了,却掉这些,也没啥了。其实我们 add_library 中添加刚刚创建好的 HelloNDK 以及他所在路径。

好了今天就到这里吧。