android sudio jni 调用so_Android开发调用C++算法库完全指南(亲测可用)

实际项目中的算法库很多是C++代码编写的,算法工程师经常面对的一个问题是算法的跨平台调用,比如算法工程师在平常工作中是基于C++代码进行算法开发的,公司开发一款android系统的应用程序,需要调用C++算法库,如何调用?解决这类问题的核心思想是:(一)跨平台编译工具CMake,即只需要一次编写算法代码,就可以在多个平台生成对应的算法库;(二)Android开发是基于java语言而算法库是C++代码实现的,我们面对的另一个问题是在android开发中用java语言调用C语言算法接口,不同语言有不同的书写规范,这当然是不可能编译成功的,因此我们需要通过中间层(JNI编程)来搭建java语言和C语言沟通的桥梁,本文就通过android系统调用C++算法库来阐述算法库的跨平台调用思想(文末附完整代码链接)。

目的:Android开发调用C++算法库(数组求和算法)

Android集成开发工具:Android Studio3.10.2

跨平台编译工具:CMake3.4.1

1. 新建使用JNI编程的工程

1)File -> New -> Project,勾选native C++,表示项目中可使用C语言进行编码。

473cb634d56ade2c0eb27217e3270a79.png

2)设置项目和包的名称:

fa4629670ea3e36a1f39a4da03a5ab08.png

在向导的Customize C++ Support部分,选择默认的Toolchain Default。

87174fc79e449f8b37cc3864af8427bd.png

2. 下载JNI开发所需的NDK,LLDB,CMake工具包

1) 打开Android studio -> Preferences -> Android SDK;

2) 在SKD标签中选择LLDB,NDK,CMake工具包进行下载;

5200dafdff6466f436ae98a95a6e5b15.png

JNI:Java Native Interface(Java本地编程接口),一套编程规范,它提供了若干的API,实现了Java和其他语言的通信(主要是C/C++)。

NDK:Native Development Kit(本地开发工具),一系列工具的集合,这套工具允许你在Android开发中使用C和C++代码。

CMake:跨平台编译工具。

LLDB:一种调试程序,ANDROID STUDIO使用它来调试原生代码。

3. 切换到project选项,在目录 jniarray/app/src/main/java的Mainactivity.java中写求向量求和算法的接口函数:

ff72f277073dd48af18d8487e7bd4859.png

我们只声明了接口函数并无实现,因此接口函数显示红色的。

同时按option键+enter键,选择create function Java_com_zl_jniarray_MainActivity_sumArray并按Enter键,在nativa-lib.cpp生成该接口函数的实现体:

78528caacef7a6338dae75850fadd695.png

下面编码该接口函数的实现:

211ca352179b7ad755b38dd23ebbc97b.png

细心的读者会发现该接口函数的实现与cpp并不完全相同,如jint表示整型变量,jintArray表示整形数组,因为接口函数是通过JNI编码实现的,JNI与java语言和C语言都能进行交互。

我们完成了接口函数的实现后,用CMake进行编译,生成Android开发所需要的算法库,CMakeList.txt文件是指定CMake的编译规则,下面解释下该项目的编译规则:

4dd4cb38a870f7eef31ea66ea1c56a19.png

4 .点击项目构建按钮

60b938696e7d5ef964f52eaab8c51744.png

默认生成的库路径为:app/build/intermediates/cmake/debug/obj/

9b148126901c074316ff8ea3a8989142.png

实际开发中需要release模式下的算法库,我们在Android Studio左下角点击Build Variants标签并选择Release-x86,再次重新构建生成release模式下的动态库:

3b63e77f60b5e51f756ac682bc616b5b.png

生成release模式下的动态库:

ef8a54e6ac9b23be02ed6e172db164c2.png

5. jar包的生成

Android开发以.so库和jar包的形式调用算法库,我们已经生成了debug和release模式下的.so动态库,下面介绍如何生成jar包。

切换为Android选项:

df9e644db67be84348da101407395b37.png

新建模块module,选择Android Library

d03443634233a44fba34f76a1b85c765.png

点击下一步,设置module的包名应和app的包名相一致:

ad04c77d6667cf7435c6f54d3b62ec08.png

在目录com.zl.jniarray新建java类,该类名与app的类名相同,声明接口函数,并下载算法库:

53c614fe22d91c2f83a0fc605acd8b2f.png

c85e13c44e7ac515412f8706068b4dcf.png

在jniarray中的build.gradle文件添加下面语句,目的是设置保存jar文件的路径和重新命名jar文件:

8b3c4e582b69c86caa7709050d8b199d.png

重新编译,切换目录为jniArray文件夹,使用如下命令./gradlew makeJar重新命名jar文件。

因此,我们在jniarray/build/libs文件夹生成jni-array的jar包。

e87de8bfda1390c773948248c93071fe.png

6. 算法测试

新建工程,选择empty activity,其他选项默认,点击Finish。

8bf2ff06261aa6025f55a1647ad57a6c.png

在目录MyApplication2/app/lib文件夹添加算法.so库和jar包:

a2b8b1277810519d9023f94eeed81437.png

添加jar包到该项目中,右键jni-array,点击Add As Library。

614eb0941f3ce4aab85d9b0dd82d6c24.png

则会在app的gradle文件中自动添加下面的语句:

0a215800549fa6905c3255769bd3b2fe.png

在app的gradle文件中添加搜寻动态.so库的路径:

685a8ff6fdf66a6f8e6fb4922cd35fb9.png

我们在com.zl.myapplication包中的MainActivity1.java中成功调用了C++算法库。

6. 后续说明

这只是一个简单的Android开发调用C++库的例子,实际项目的算法远远比这个复杂,但是思想其实是不变的,因为我们有了CMake这个强大的工具,只要我们写了算法的cpp文件,然后复制粘贴到cpp和header文件夹内,写好你的CMakelist配置文件,就能生成跨平台库了,当然,项目自带的非算法cpp文件包含了JNI编程,它是沟通算法库与java语言的桥梁,我们用java语言调用JNI编程的接口函数,然后JNI调用C++算法,JNI也成为中间层。

调用流程:

04f60037c8481feac0a34385a540f6aa.png

JNI编程最大的难点之一是类型的转换和方法的调用,这里我就不展开了,若有问题的话可以私信小编。

如下图的项目算法的文件说明,红色框的文件是我已经写好的算法文件,蓝色框是JNI编程,算法文件复制粘贴到cpp文件夹即可,我只需要写蓝色框文件的接口函数,目标是实现java语言调用C++代码的算法库。

5616068645d1aa3918a36125b37fca6f.png

7. 小结

文章通过简单的例子说明了java语言调用c++库的过程,这种跨平台调用算法库的思想是算法工程应掌握的,希望这篇文章能够帮到你。

完整代码链接:

github:https://github.com/zhangleiszu/Android-C-

欢迎扫码关注:

5eeafdd1696a33b1edcdc985e40978d7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值