看过了我前两篇的小伙伴,现在是不是特别想用 JNI 搞点什么东西呢?可是搜索到的例子都特别简单,没有使用 JNI 的必要,而有必要使用 JNI 的例子又不好找,所以就很尴尬。
其实,经常逛 Android 官网的小伙伴应该能了解到,Android 官网其实是有提供一些 JNI 的 demo 的,而且从易到难的都有。

我这里就用一个官网推荐的案例:「犹他茶壶」来举个例子吧。
废话不多说,直接上 demo 运行图:
普通版
60帧版
多个茶壶版
怎么样,这样的效果是不是就值得用 JNI 处理了?
不过,我们先不看茶壶
看茶壶之前,我们先看下官方提供的一个关于 NativeActivity 的例子
把这个例子导入到 Android Studio 中,发现项目结构很简单:
简单到连 java 代码都没有。
我们来看一下这几个必要的文件吧
CMakeLists.txt
其中我们最熟悉的就是
add_library
这句就是我们要具体编写的C++ 文件,而其余代码我们可以先理解成为了实现demo 功能而添加或者链接的库。
我们再来看下清单文件 : AndroidManifest.xml
红框中的解释十分关键
android.app.NativeActivity
是 Android 自带的库,他在这个 demo 中是为了与 NDK 的 代码集成的。
而
则是与 NativeActivity 绑定的 C++ 库的名称,这两者链接上关系后,才能让 NativeActivity 去调用 C++ 库的方法。
而我们现在提供的 C++ 库的对应的名字是 native-activity
所以这里就必须得指定成这个名字了。

但是,这样指定就能自动加载so库了吗?
我们点进 android.app.NativeActivity 看一下
原来是 NativeActivity 内部在 onCreate 中做了加载文件名称为 main 的c++库文件了。
这下来我们来详细看一下这个示例demo 的源码:
main.cpp
头部引入
定义两个结构体
初始化默认视图方法
调整当前视图
绘制
处理下一个输入事件
处理下一个主任务
获取监控传感器实例
主方法
整个 demo 的处理流程就是:
① 调用 android_main 方法
android_native_app_glue
库会调用
android_main
函数,向其传递预定义的状态结构。它还起到封装容器的作用,能够简 NativeActivity回调的处理过程。
② 接下来,程序会处理由 android_native_app_glue 库排入队列的事件。
③ 使用 sensor.h 中的 API 监控传感器
④ 轮询传感器事件,发送消息到 android_native_app_glue,判断消息是否与 android_main 中定义的任何 onAppCmd 事件匹配。
如果匹配,消息会发送给处理程序并执行。

当队列为空,且程序退出轮询循环后,程序会调用 OpenGL 以在屏幕上进行绘制。
运行结果是
茶壶相关代码,在 Github 也提供了,只不过比这个更复杂一些。
不过如果各位小伙伴有耐心的话,也是能看懂的,由于篇幅限制,我这里就不贴图了,有兴趣的朋友可以自行搜索导入到 Android Studio 中看一下,我也会在评论区将 官网 demo 地址贴过来。
如果觉得本篇文章还不错,麻烦动动小手帮我点下赞吧~~~


