鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

鸿蒙JNI开发现状

现阶段,不仅鸿蒙JNI相关的开发资料较少,而且Phone相关的JNI开发资料几乎没有,这对于新入行的鸿蒙开发者们来说,非常不友好。

也可能会给Android工程(使用了SO库的工程)在迁移至鸿蒙系统时造成了阻碍。

案例演示

废话不多说了,接下来,我们来演示鸿蒙手机版工程是如何做JNI开发的。

案例1:Native项目

如果开发者们只是想做简单的Native开发,并非为第三方提供SO库,这就非常简单了,详细如下:

1、创建Native C++工程

目前,通过DevEco-Studio创建创建Native C++模板类型的工程时,只有Car支持这种模板(Phone默认不包含Native C++模板)。
不必担心,我们就先创建Car类型的工程,然后选择Native C++模板,如下图:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

然后,输入工程名称等信息,如下图:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

接下来,选择C++标准库,默认就可以了,如下图:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

点击【Finish】,工程就创建好了。

2、修改DeviceType配置

当前工程默认是Car类型的,想要支持手机,我们只需要修改DeviceType即可。

首先,找到config.json文件,如下图:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

将“car”改为“phone”,即可支持运行在手机设置上了(是不是超级简单呢),如下图:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

3、测试

我这边使用的是鸿蒙手机进行测试的(鸿蒙手机是:由安卓P40升级的Harmony OS)。
另外,在真机上调试、运行工程,需要申请证书(我这边已申请,没有的同学,可以去华为官网申请)。

测试前,我们先看下默认的模板工程结构:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

整体的调用流程也很简单:

开发者运行工程 --> build工程 --> 执行build.gradle --> 执行里面的externalNativeBuild --> 生成so库文件 --> app启动 --> 页面加载 --> 调用MainAbilitySlice类 --> 查找并加载so库 --> 在onStart生命周期方法中调用native方法 --> 执行so中的native实现方法 --> 返回结果 --> 绑定给text控件(最终将结果显示在页面上)

手机上的运行结果(直接横屏显示......这是因为我们的工程本身是Car类型的模板工程,UI样式默认设置的是横屏的。如果不喜欢,开发者们也可以自行修改UI样式):

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

so库创建的默认位置:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

案例2:Native项目

如果开发者们不仅要做native开发,还希望将so文件提供给第三方使用,这样我们就需要以module的形式来开发了,同样也不怎么复杂。

1、问题分析

现在有一个问题:创建module时,连native c++模板都没有了,如下图:

鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

这不是要让广大开发者们生气、抓狂、准备画圈圈了么。

解决方案:

其实,我们还有其他的方式(原因:JNI开发也就涉及到native方法定义、native源码、Cmake配置文件、Gradle配置等内容):我们可以新建一个Car类型的Native C++工程和一个Harmony os Library Module,然后将模板工程entry中的JNI代码迁移到Harmony os Library Module中。

2、创建Car类型的Native C++模板工程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzsf.html