哪里有更好的 JNI demo 学习一下呢

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

看过了我前两篇的小伙伴,现在是不是特别想用 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 的 代码集成的。

ta-data android:name="android.app.lib_name"android:value="native-activity"/>

则是与 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 地址贴过来。

如果觉得本篇文章还不错,麻烦动动小手帮我点下赞吧~~~

 
友情链接
鄂ICP备19019357号-22