鸿蒙手机版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)。
另外,在真机上调试、运行工程,需要申请证书(我这边已申请,没有的同学,可以去华为官网申请)。
测试前,我们先看下默认的模板工程结构:
整体的调用流程也很简单:
开发者运行工程 --> 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++模板都没有了,如下图:
这不是要让广大开发者们生气、抓狂、准备画圈圈了么。
解决方案:
其实,我们还有其他的方式(原因: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):
总结
鸿蒙进行JNI开发其实不难,与安卓基本上一致,只是参考资料少一些而已。
如果大家对JNI不熟悉,可以参考我之前写的JNI基础的相关文章:
https://www.jb51.net/article/169438.htm
https://www.jb51.net/article/130786.htm
到此这篇关于鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)的文章就介绍到这了,更多相关鸿蒙JNI开发实战内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
- 下面我们一起来看一篇关于 安卓开发之Intent传递Object与List的例子,希望这个例子能够为各位同学带来帮助。 Intent 不仅可以传单个的值,也可以传对象与数据集合...2016-09-20
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
- 在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下...2021-08-12
- 在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微...2016-05-19
- 这篇文章主要给大家分享我对JS插件开发的一些感想和心得的相关资料,需要的朋友可以参考下...2016-02-09
- 从这一节开始,我们将从零开始打造我们的chrome插件工具库,第一节我们将讲一下插件开发的基础知识并构建一个简单但却很实用的插件,在构建之前,我们先简单的了解一下插件以及插件开发的基础知识...2020-10-03
Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
这篇文章主要介绍了Cocos2d-x UI开发之CCControlColourPicker控件类使用实例,本文代码中包含大量注释来讲解CCControlColourPicker控件类的使用,需要的朋友可以参考下...2020-04-25详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
这篇文章主要介绍了详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现的相关资料,需要的朋友可以参考下...2017-03-13- 这篇文章主要为大家介绍了Java开发SpringBoot如何集成接口文档的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-28
- 鸿蒙系统使用 JavaScript 开发 GUI 是一种类似于微信小程序、轻应用的模式。这篇文章给大家带来了逐行分析鸿蒙系统的 JavaScript 框架的相关知识,感兴趣的朋友跟随小编一起看看吧...2020-09-17
- 前页我们讲了 Drupal8模块开发之路由、控制器和菜单链接教程 ,现在我们将学习进一步开发Drupal8模块,区块和表单。 上一教程:Drupal8模块开发之路由、控制器和菜单链...2016-11-25
- 这篇文章主要介绍了24个ES6方法解决JS实际开发问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
Unity3D游戏开发数据持久化PlayerPrefs的用法详解
在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25Android 组件开发之带label的文本输入框(EditText)
文章给大家介绍Android 组件开发之带label的文本输入框(EditText),有需要了解的朋友可参考,希望此教程对各位有所帮助。 在Android开发中,我们的Activity都不免要用...2016-09-20基于React-Dropzone开发上传组件功能(实例演示)
这篇文章主要介绍了基于React-Dropzone开发上传组件,主要讲述的是在React-Flask框架上开发上传组件的技巧,需要的朋友可以参考下...2021-08-16.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
中午没事,把去年刚毕业那会画的几张图翻出来了,大概介绍Winform应用程序运行的过程,以及TCP协议在Winform中的应用。感兴趣的朋友可以了解下;如果有Windows消息机制等基础,很好理解这两张...2020-06-25- 这两天项目开发中,需要实现一些比较实用的功能,用了两个使用的sql,总结一下,怕下次忘记了。 1. 检索数据库中跟提交的内容相匹配的内容 比如:提交的数据是“游...2016-11-25
- win7下搭建nginx+php的开发环境,需要的朋友可以参考下...2016-05-22
- ASP.Net开发常见的一些问题总结,需要的朋友可以参考一下...2021-09-22