C++编写、生成、调用so库详解(二)

我们上篇中主要讲了怎么去打包so库

C++编写、生成、调用so库详解(一)

这篇我们就来说一些怎么调用so库

目录

1.调用符合JNI标准的so库

2.调用不符合JNI标准的so库


上面说了两种不同类型的so库,我们分别来看一下怎么调用这两种,在调用so库之前,我们先说一下直接调用上面写的C++代码,

1.调用符合JNI标准的so库

符合JNI标准的so库,就是我们上一篇中提到的,写起来麻烦,调用起来方便的so库,

调用这个库需要知道包含本地方法的包名和名还有方法名,要不然不好调用.

我这边为了区分开,就新建了一个普通的Android项目,首先将so库复制进来

放在app->libs目录下,没有目录就新建一个目录

然后打开app的build.gradle文件,注意是app的,不是project的

在android节点下新加以下代码,注意不要加错节点

android {...defaultConfig {...}sourceSets {main {jni.srcDirs = []jniLibs.srcDirs = ['libs']}}
}

然后新建一个Java文件,对应我们前面说到写了一个native-lib的文件,里面对应了一个Java的文件,

我们这边就新建一个Java类

这边注意看圈红的地方,全都是上文中第5条里提到的注意点,一个字母都不能错,我这边的包名和类目都是前面一篇中指定的,各位要替换成自己的

然后就可以直接调用啦

能看到我这边已经调用成功了.

2.调用不符合JNI标准的so库

这类库就是在编写so库的时候,没有将JNI写到so库中,这时候我们就需要在外面自己写JNI了,

调用这类so库需要用到两种文件,一个是so库,还有一个就是so库对应的头文件,

这个写起来就比较麻烦了,

1. 我们将so库复制进来

放在app->libs目录下,没有目录就新建一个目录

然后新建cpp目录,如下

2. 新建cpp目录

可以看到,这边我还新建了一个include文件夹,中间放的是头文件,就是上文中提到的so库对应的头文件,然后新建CMakeLists.txt和native-lib.cpp文件,CMakeLists.txt中我们需要改一下

中间标红的地方就就是我们需要改的

include_directories是指定我们刚刚复制进来的头文件的路径,

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI}")就是链接到我们刚刚的libs下面的so库,

target_link_libraries中最后添加我们的so库名字,加到最后,顺序是有规则的.

3. 然后我们就可以开始写JNI了

可以看到和我们上一篇中写的JNI几乎一样,

4. 配置文件

打开app的build.gradle文件,注意是app的,不是project的

添加几个配置节点

android {...defaultConfig {...externalNativeBuild {cmake {arguments "-DANDROID_STL=c++_shared"}ndk {abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"}}}sourceSets {main {jni.srcDirs = []jniLibs.srcDirs = ['libs']}}externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.22.1'}}...
}
5. 写外面的Java类

注意,这边有个容易犯错的地方,就是System.loadLibrary,不再是加载sodemo那个库,而是加载我们刚刚写的这个JNI的库,库名字就是CMakeLists.txt中的project("sodemo2"),各位要换成自己的库名字

可以看到,我这边已经调用成功了.

3.结束

至此so库的打包和调用都讲完了,如果有不对的地方希望大家指出来...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Uniapp插件市场试用原生插件项目 没有MD5签名安卓无法自定基座打包的情况

Uniapp插件市场中,有些插件是原生插件,必须使用自定义基座才能打包。但是传统keytool命令,已经无法看到安卓证书的MD5签名。现采用Android Studio查询signingReport的办法获取证书的MD5签名,并对插件的示例项目进行打包运行。一、…

烟火检测/周界入侵/视频智能识别AI智能分析网关V4如何配置ONVIF摄像机接入

AI边缘计算智能分析网关V4性能高、功耗低、检测速度快,易安装、易维护,硬件内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。算法可按需组合、按…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-5 select

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>select</title> </head><body> <!--单选下拉菜单可设置默认选中项--> 所在城市&#xff08;单选&#xff09;:<br> <select>…

广告灯的左移右移

1&#xff0e;  实验任务 做单一灯的左移右移&#xff0c;硬件电路如图4.4.1所示&#xff0c;八个发光二极管L1&#xff0d;L8分别接在单片机的P1.0&#xff0d;P1.7接口上&#xff0c;输出“0”时&#xff0c;发光二极管亮&#xff0c;开始时&#xff0c;P1.0→P1.1→P1.2→…

Oracle 数据库备份与恢复的重要性与最佳实践

文章目录 一、备份的重要性二、备份工具-RMAN四、比较备份策略五、实例恢复六、完全恢复与不完全恢复七、备份与恢复脚本 引言&#xff1a; 在现代信息时代&#xff0c;数据已成为组织和企业最重要的资产之一。保护和恢复数据的能力对于确保业务连续性和减少潜在风险至关重要。…

传感器产业链图谱及上中下游市场剖析(附产业链全景图)

传感器是一种通常由敏感元件和转换元件组成的检测装置&#xff0c;测量并感知信息后&#xff0c;通过变换让传感器中的数据或价值信息转换成电信号或其他所需形式的输出&#xff0c;以满足信息的传输、处理、存储、显示、记录和控制等要求。 传感器产业链包括上游原材料、生产设…

【LeetCode】202. 快乐数(简单)——代码随想录算法训练营Day06

题目链接&#xff1a;202. 快乐数 题目描述 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终…

CUDA tips

命令行查看核函数消耗的寄存器和共享内存数量 nvcc --ptxas-options-v reduce_sum.cu nvprof 使用 由于 8.0 及以上计算能力的显卡用不了 nvprof&#xff0c;官方建议用 nsight system 和 ncu&#xff0c;但是如果只想命令行打印表格查看 kernel 概况感觉还是 nvprof 方便&am…

[flutter]GIF速度极快问题的两种解决方法

原因&#xff1a; 当GIF图没有设置播放间隔时间时&#xff0c;电脑上会默认间隔0.1s&#xff0c;而flutter默认0s。 解决方法一&#xff1a; 将图片改为webp格式。 解决方法二&#xff1a; 为图片设置帧频率&#xff0c;添加播放间隔。例如可以使用GIF依赖组件设置每秒运行…

用Python优雅地写出数学表达式的LaTeX代码

用Python优雅地写出数学表达式的LaTeX代码 目录 Latexify LaTeX 安装方法 版本要求 使用方法 实例一 实例二 实例三 实例四 实例五 Latexify Latexify是一个Python库&#xff0c;它可以将数学表达式转换为LaTeX代码。通过使用latexify-py&#xff0c;可以将数学表达…

如何实现 H5 秒开?

我在简历上写了精通 H5&#xff0c;结果面试官上来就问&#xff1a; 同学&#xff0c;你说你精通 H5 &#xff0c;那你能不能说一下怎么实现 H5 秒 由于没怎么做过性能优化&#xff0c;我只能凭着印象&#xff0c;断断续续地罗列了几点&#xff1a; 网络优化&#xff1a;http2、…

递归、搜索与回溯算法(专题六:记忆化搜索)

目录 1. 什么是记忆化搜索&#xff08;例子&#xff1a;斐波那契数&#xff09; 1.1 解法一&#xff1a;递归 1.2 解法二&#xff1a;记忆化搜索 1.2.1 记忆化搜索比递归多了什么&#xff1f; 1.2.2 提出一个问题&#xff1a;什么时候要使用记忆化搜索呢&#xff1f; 1.3 …