鸿蒙JNI开发实战 原创 精华
一、JNI
1.1 创建工程
用 DevEco Studio 创建一个新的工程,我的 DevEco Studio 版本为2.1。创建工程第一步的时候,需要选择模版,请选择 Native C++ 这个模版。这个模版为我们提供了JNI开发的环境,我们在这个模版里可以更容易的使用JNI 去调用C语言代码。
(1) 创建工程第一步:选择 Native C++ 模版,如下图所示:
(2) 创建工程第二步:填写项目名称、项目存放目录,如下图所示:
- 建议填写project name和小编的一样,因为后面的一些配置和包名有关。
(3) 创建工程第三步:选择语言版本,选择默认的即可,如下图所示:
至此,项目创建完毕,项目中CPP目录就是编写C语言代码的地方。整个目录如下图所示:
1.2 编写C语言代码
接下来,我们要做一个简单的计算器,实现最基本的加法、减法、乘法、除法。加减乘除的计算功能用C语言实现,界面控件布局等则用 Java语言实现,然后采用 JNI 的方式去调用C语言里的加减乘除方法。
(1) 在和 MainActivity 同级目录下新建一个 java 类,类名为:JNITools。
(2) 在 hello.cpp 里面实现加减乘除方法。
敲黑板,重点来了。 到了这里,有的同学可能会感觉奇怪,为什么我在JNITools里面声明方法,方法的具体实现却跑到了hello.cpp文件里。因为仔细看上面的代码,是这句代码 System.loadLibrary("hello");
把这两个文件关联到了一起。在iOS里面有头文件和源文件之分,JNITools.java 就相当于头文件,hello.cpp 就相当于源文件。
打开 hello.cpp,在方法体里面添加自己的业务逻辑代码:
Java_com_example_jnidemo_JNITools_addNumber
这个方法名由:Java+包名+类名+方法名 构成,一定要和自己的对应,否则程序会找不到方法的实现而闪退。
至此,我们的C语言代码就写好了。JNITools里的方法是提供给Java代码调用的,hello.cpp里面的代码最终会被编译成so库。
1.3 Java代码调用C语言
下面,就回到了Java这部分,这部分都是大家比较熟悉的,就加快进度直接上代码。
(1) MainAbilitySlice 里添加代码:
(2) 运行效果
运行之后,可以在模拟器的屏幕上看到:30
1.4 生成SO库
前面就提到过hello.cpp最终会被编译成so库,提供给普通的鸿蒙程序使用。那么怎么将hello.cpp编译成so库呢?其实当你编译运行之后,系统就自动生成了SO库。SO库的存放目录:entry->build->intermediates->libs。
二、SO库的使用
本篇主要介绍如何在普通的鸿蒙工程中使用编译好的SO库文件。首先,新建一个普通的鸿蒙项目工程,我的工程名叫SOTest。项目工程建好后,就将SO库引入到工程中。
2.1 将SO库引入工程中
DevEco Studio 默认创建了libs目录,所以将之前编译好的SO文件直接拷贝到libs目录中即可。
2.2 引入 JNITools 文件
SO库文件是一个动态库,无法打开,所以我们看不到里面有些什么,那么就有一个问题,如果我们把自己编译好的SO库给别人去用,别人又看不到SO里面的内容,那他怎么调SO库里面的方法呢?所以我们还需要提供一个配套的头文件给使用SO库的开发人员。这个JNITools就是头文件,当然你也可以取其他的名字。这个JNITools在我们上一节已经出现过了,这里还是把代码贴出来:
在com.example目录下再新建一个包,包名为:jnidemo,然后再引入JNITools文件。
2.3 调用SO文件中的代码
(1) MainAbilitySlice 里添加代码:
(2) 运行效果
运行模拟器,屏幕上显示 30
至此,就完整的介绍了如何生成SO库文件,以及如何使用SO库文件,你学会了么。
如果你觉得本篇文章对你有用,请给小编一点鼓励,点赞或打赏,感谢。
JNI使用的人多么?