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

news2024/12/28 8:31:26

我们上篇中主要讲了怎么去打包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.coloradmin.cn/o/1394043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全球网络是如何互联的?

1.Internet 在之前的学习中我们知道了Internet和internet的区别,也知道了Internet目前是全球最大的网络,并且由很多规模不同的网络互联而成。到目前已经有超过90个国家接入了Internet,主机超过400万台,可以说Internet是全人类的信…

【Ubuntu18.04安装Labelme】

Ubuntu18.04安装Labelme 1 安装Anaconda并创建conda环境2 安装依赖3 安装Labelme4 安装验证 1 安装Anaconda并创建conda环境 Anaconda3安装教程:https://blog.csdn.net/dally2/article/details/108206234 "ctrlaltt"快捷键打开终端,创建conda…

gateway Redisson接口级别限流解决方案

文章目录 前言1. 计数器算法(固定窗口限流器)2. 滑动窗口日志限流器3. 漏桶算法(Leaky Bucket)4. 令牌桶算法(Token Bucket)5. 限流队列应用场景实现工具 一、Redisson简介二、Redisson限流器的原理三、Red…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三基于我的已知推荐 Web 框架系统方案建议 - 让 ChatGPT 推断我的一些微末思考结论 本文只是我的一些尝试,基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定…

ABAP IDOC 2 XML

有个需求,外围系统希望我们给到一个IDOC 记录的样例,但是我们we02中并无法看到 就找了一个demo去直接展示IDOC内容 *&---------------------------------------------------------------------* *& Report Z_IDOC_TO_XML *&------------…

关于前端或者postman传递Date数据测试接口报错

错误: org.apache.ibatis.exceptions.PersistenceException: \r\n### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String\r\n### Cause: java.lang.IllegalArgumentException: invali…

服务器运维小技巧(一)——如何进行远程协助

服务器运维中经常会遇到一些疑难问题,需要安全工程师,或者其他大神远程协助。很多人会选择使用todesk或者向日葵等一些远控软件。但使用这些软件会存在诸多问题: 双方都需要安装软件,太麻烦需要把服务器的公钥/密码交给对方不知道…

Android WorkManager入门(二)

WorkManager入门 上一篇前言创建 WorkRequest并提交 定时的任务(PeriodicWorkRequest)配合约束使用定义执行范围失败后的重试为WorkRequest打上TAG其他取消方法 传参和返回参数总结参考资料 上一篇 Android WorkManager入门(一) …

权威认证!腾讯微搭入选Forrester《2023年第四季度中国专业开发人员低代码平台市场分析报告》

在Forrester近日发布的《The Low-Code Platforms For Professional Developers Landscape In China,Q4 2023》(《2023年第四季度中国专业开发人员低代码平台市场分析报告》)中,腾讯云成功入选。该报告通过对中国的低代码市场进行了深入的研究…

2018年认证杯SPSSPRO杯数学建模C题(第一阶段)机械零件加工过程中的位置识别全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 基于轮廓特征的机械零件位置识别研究 C题 机械零件加工过程中的位置识别 原题再现: 在工业制造自动生产线中,在装夹、包装等工序中需要根据图像处理利用计算机自动智能识别零件位置,并由机械手将零件自动搬…

[Android] Android架构体系(1)

文章目录 Android 的框架Dalvik 虚拟机JNI原生二进制可执行文件Android NDK中的binutils Bionic谷歌考虑到的版权问题Bionic与传统的C标准库(如glibc)的一些不同 参考 Android 的框架 Android 取得成功的关键因素之一就是它丰富的框架集。 没有这些框架…

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase,到如今 3 个核心业务应用 OceanBase,国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案,选择升级至 OceanBase?杭州游卡网络技术有限公司(…

WordPress设置回收站自动清理天数的插件Change Empty Trash Time

前面boke112百科跟大家分享的『WordPress回收站自动清空时间?如何关闭回收站或设置自动清理天数?』一文,就介绍了可以添加一行代码实现关闭或设置回收站自动清理时间,也可以通过安装Change Empty Trash Time插件来实现。 今天bok…

Jenkins-Pipeline

Pipeline 1 安装插件 2 新建一个 Pipline 工程 3 配置Pipeline 脚本 agent的使用可以参考这个文档 pipeline {agent anystages {stage(Build) { steps {echo Building project...}}stage(Test) { steps {echo Testing project...}}stage(Deploy) { steps {echo Deploying …

模具制造企业ERP系统有哪些?企业怎么选型适配的软件

模具的生产管理过程比较繁琐,涵盖接单报价、车间排期、班组负荷评估、库存盘点、材料采购、供应商选择、工艺流转、品质检验等诸多环节。 有些采用传统管理手段的模具制造企业存在各业务数据传递不畅、信息滞后、不能及时掌握订单和车间生产情况,难以对…

SD-WAN企业组网:实现高效、安全的跨国企业连接

在当今数字化时代,企业日益全球化,跨国办公成为常态。为了应对这一挑战,越来越多的企业选择采用先进的网络技术,其中SD-WAN(软件定义广域网)便是一种备受青睐的解决方案。 什么是SD-WAN企业组网&#xff1…

【LeetCode每日一题】2171. 拿出最少数目的魔法豆

2024-1-18 文章目录 [2171. 拿出最少数目的魔法豆](https://leetcode.cn/problems/removing-minimum-number-of-magic-beans/)思路: 2171. 拿出最少数目的魔法豆 思路: 对输入的数组进行排序,使得数组中的元素按照升序排列。初始化一个变量s…

易懂的方式讲解ARM中断原理以及中断嵌套方法

ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ。 先…

flink 最后一个窗口一直没有新数据,窗口不关闭问题

flink 最后一个窗口一直没有新数据&#xff0c;窗口不关闭问题 自定义实现 WatermarkStrategy接口 自定义实现 WatermarkStrategy接口 代码&#xff1a; public static class WatermarkDemoFunction implements WatermarkStrategy<JSONObject>{private Tuple2<Long,B…

第17章_反射机制拓展练习(关于Class,反射的应用,综合练习)

文章目录 第17章_反射机制拓展练习关于Class1、获取Class对象 反射的应用2、创建对象3、修改属性值4、调用方法5、获取类型信息6、榨汁机7、获取泛型参数8、自定义注解19、自定义注解2 综合练习10、AtguiguDemo11、AtguiguStudent12、自定义注解 第17章_反射机制拓展练习 关于C…