欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 运维知识 > windows >内容正文

windows

鸿蒙so系统,鸿蒙手机版jni实战(jni开发、so库生成、so库使用) -ag凯发k8国际

发布时间:2024/10/12 windows 31 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 鸿蒙so系统,鸿蒙手机版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 模板,如下图:

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

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

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

2、修改devicetype配置

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

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

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

3、测试

我这边使用的是鸿蒙手机进行测试的(鸿蒙手机是:由安卓p40升级的harmony os)。

另外,在真机上调试、运行工程,需要申请证书(我这边已申请,没有的同学,可以去华为ag凯发k8国际官网申请)。

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

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

开发者运行工程 --> build工程 --> 执行build.gradle

--> 执行里面的externalnativebuild --> 生成so库文件 --> app启动

--> 页面加载 --> 调用mainabilityslice类 --> 查找并加载so库

--> 在onstart生命周期方法中调用native方法 --> 执行so中的native实现方法

--> 返回结果 --> 绑定给text控件(最终将结果显示在页面上)

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

so库创建的默认位置:

案例2:native项目

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

1、问题分析

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

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

ag凯发k8国际的解决方案:

其实,我们还有其他的方式(原因:jni开发也就涉及到native方法定义、native源码、cmake配置文件、gradle配置等内容):我们可以新建一个car类型的native c 工程和一个harmony os library module,然后将模板工程entry中的jni代码迁移到harmony os library module中。

2、创建car类型的native c 模板工程

比较简单,大家可以参考案例1的工程创建流程(此处就不再重复截图了)

3、创建harmony os library module

大家直接下一步就好(此处就不再截图了)。

4、修改entry devicetype类型(改成phone)

5、拷贝文件

将entry下的.cxx目录和cpp目录拖拽到 libnative module中的相同位置:

将entry下的build.gradle中 native 编译脚本拷贝至 libnative module中相同位置:

6、新建类定义native方法

为了加深大家理解,此处不再使用默认的hello.cpp了,咱们实现一个简单的jni开发:

新建testnative类,定义native方法,如下图:

通过deveco-studio的命令工具terminal,进入java目录,创建头文件:

执行命令:

进入module目录: cd libnative/src/main/java/

根据native方法生成头文件:javah -jni xxxx(包名).类名

将头文件拷贝到cpp目录下,然后,右键cpp目录,创建头文件对应的实现类:

7、修改cmakelist.txt

# the minimum version of cmake.

cmake_minimum_required(version 3.4.1)

project(testnative)

add_library(native shared testnative.cpp)

target_link_libraries(native)

8、生成so库

此时,我们libnative module库的功能已经实现了,可以生成so库给其他工程使用了。

我们需要先让libnative被entry依赖,这样运行app时,才会自动加载libnative,从而执行其build.gradle中的native build配置,生成so库。

entry依赖libnative,我们可以在entry的build.gradle中进行配置:

运行app后,查看libnative module下,生成了so库:

9、生成的so库,怎么提供给其他工程使用呢?

也很简单,jni主要包含了两部分内容:定义的native方法的java类(java代码中调用so库的入口)、native方法的实现类,我们只需要将这两部分提供给他们就可以了:

1、定义的native方法的java类:提供libnative的har包即可(给第三方时,一般不提供源码)

2、native方法的实现类:提供so库文件即可

测试:

我们简单点,直接把so库、har提供给我们工程的entry进行测试即可,不再新建工程了(因为,我比较懒,哈哈):

首先,我们先取消entry build.gradle中依赖libnative的配置(防止重复依赖,因为:har已包含了libnative的java代码):

我们将libnative中的so库、har拷贝到entry的libs目录下:

在页面中编写调用har中native方法的代码:

运行app(运行前最好clean下工程、同步下gradle,确保依赖的是改har,而非工程中的libnative module):

总结

如果有问题,欢迎留言交流。

祝大家生活愉快、工作愉快,每天顺心、开心!!!

总结

以上是ag凯发k8国际为你收集整理的鸿蒙so系统,鸿蒙手机版jni实战(jni开发、so库生成、so库使用)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图