鸿蒙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开发实战内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

鸿蒙手机版JNI实战案例解析(JNI开发、SO库生成、SO库使用)的更多相关文章

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. android – Carousel中的ArrayIndexOutOfBoundsException – MessageQueue回调和handleReceiveCallback中的异常

    我在我的应用程序中使用轮播.对于拥有Android4.2.2且仅在横向模式下的用户,他们报告此问题:我无法在这里找到问题所在.解决方法看起来您将视图存储在数组中.旋转设备时,将重置此阵列并删除所有视图.当数组适配器尝试获取其位置时,因为该数组为空,所以它返回-1.尝试处理旋转事件并确保重新填充数组.我没有看到一些代码就无法回答,但它看起来像是清空或设置为null的视图数组/列表.

  3. android – JNI:如何获得jbyteArray大小

    背景我正在使用JNI中的字节数组.而且我无法获得jbyteArray的长度.我正在Windows7中的eclipse中编写代码.Java代码:JNI代码:在JNI中,我有一个结构,它有两个成员无符号长度和无符号字符数据[1]现在我的JNI函数得到参数jbyteArrayjpSeed我想得到jpSeed的长度并将其设置为struct的length成员.问题1:如何在JNI中获得jpSeed的长度?问题2:此代码是否正常bd.data[1]=jbyteArray;?

  4. Android JNI中的高精度计时器

    我正在尝试描述我的JNI应用程序.是否有类似“自启动后获取刻度”的东西,我可以用来衡量功能和/或系统?

  5. Android NDK中的JNIEXPORT和JNICALL

    ){但是,AndroidNDK示例不使用它们.我从Oracle读了一些文档,但我仍然感到困惑.使用AndroidNDK时是否必须使用它们?问的原因之一–在eclipseCDT中突出显示的那些宏中断语法:)解决方法基本上是一个Windows问题,如果你看看oracleJavajdk附带的文件jni_md_win32.h这是宏定义:在头文件jni_md_linux.h中,这些宏是空的.所以我想,只要您不希望在使用oracleJVM的Windows中执行本机代码,就可以删除这些宏.

  6. android – JNI在应用程序中检测到错误

    我在wordpress中使用API来获取我拥有的标题数量.我的代码适用于除5.x之外的所有Android版本.当我在我的应用程序中推送一个帖子时,很遗憾地关闭了.我不知道Android5版本有什么问题.有谁知道解决方案是什么?

  7. android-studio – 无法使用Android Studio从JNI打印日志消息

    我得到的错误:error:undefinedreferenceto‘__android_log_print’我已将此行添加到我的.cpp文件中:我尝试过两种方法:__android_log_print和__android_log_write我还在我的Android.mk文件(我手动编译)中链接了日志库.LOCAL_LDLIBS:=–llog我也尝试了几种我认为的替代品:这是我的Android.mk

  8. Android JNI C/C++执行代码的当前工作目录是什么?

    在Android中,如果调用使用NDK创建的C/C++共享库并且它加载文件的当前工作目录是什么?谢谢解决方法当前目录是“/”,而不是应用程序目录:要获取应用程序目录,您需要使用对Java代码的JNI调用,而Java代码又从Context获取android应用程序目录.

  9. Android Studio 2.2原生开发迁移问题

    在切换到AS2.2之前,我有以下结构来实现我的C在这种情况下一切都很好.但是,升级到AS2.2后,我无法构建任何apk并始终收到以下错误:ExecutionFailedfortask':app:transformNative_libsWithStripDebugSymbolForDebugjava.lang.NullPointerException(noerrormessage)有人知道为什么吗?

  10. 在Android中使用C构建NDK的问题

    目前我正在使用AndroidNDK和JNI.我正在尝试使用NDK构建C代码.但是我遇到了以下错误:有人可以帮帮我吗?解决方法我刚遇到同样的问题.似乎STL默认情况下不会自动包含在NDK项目中.这也意味着iostream,fstream,string等不能马上使用.要启用它们,您需要修改Application.mk文件.如果您没有,那么只需创建一个新的空白目录.添加行:另外,还要记得包括使用namespacestd;或等效的,以及通常的#include等等

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部