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.mfbz.cn/a/330965.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TQ7.2 CPG1000A,荧光淬灭剂Tide Quencher 7.2 CPG 1000A,可以用于研究荧光标记分子的动力学行为

您好,欢迎来到新研之家 文章关键词:Tide Quencher 7.2 CPG 1000A, TQ7.2 CPG1000A,荧光淬灭剂Tide Quencher 7.2 CPG 1000A 一、基本信息 产品简介:Tide Quencher 7.2 CPG 1000A can quench fluorescence signals. …

如何搭建Z-blog网站并结合内网穿透实现无公网ip访问本地站点

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员,自己搭建网站制作网页是绕…

消息队列的作用与使用场景?

一、消息队列的作用 队列的主要作用是消除高并发访问高峰,加快网站的响应速度。 在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力,同时也使得系统响应延迟加剧。 …

安科瑞电表实现碳排放量计量——安科瑞 顾烊宇

让碳排放像电能一样方便记录 据国网苏州供电公司最新消息,江苏首个基于国网智能物联电表架构的“电碳表”项目日前在苏州试点应用,能实现电力“生产—传输—消费”全环节碳排放量的实时精准计量,让碳排放像电能一样方便记录。 电碳表是一种…

【源码赏析】:NodeEdit

一、运行效果图 总的来说还是比较流畅,也比较适合我们在此基础上进行二次开发,定义一些跟自己业务相关的节点控件。 另外,在 《Qt通用属性工具:随心定义,随时可见(一)》 系列博文中,…

【AI的未来 - AI Agent系列】【MetaGPT】4. ActionNode从理论到实战

文章目录 0. ActionNode基础0.1 官方解释0.2 我的理解0.3 ActionNode的数据结构0.4 如何使用ActionNode 1. ActionNode简单实战1.1 思考并返回特定格式的数字1.1.1 定义两个ActionNode1.1.2 为这两个动作节点设置一个父节点1.1.3 定义一个Action来承载上面的ActionNode 1.2 逐个…

Baichuan2百川模型部署的bug汇总

1.4bit的量化版本最好不要在Windows系统中运行,大概原因报错原因是bitsandbytes不支持window,bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存,offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…

spring springfox-swagger2 2.7.0配置

springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/> <!-- lookup parent from repository -->…

什么是小程序?特点和技术架构详解

小程序是一种新的移动应用程序格式&#xff0c;一种结合了 Web 技术以及客户端技术的混合解决方案。 传统的原生应用运行起来比较流畅&#xff0c;但是也有天然的基因缺陷&#xff1a; 不支持动态化&#xff0c;发布周期长需要开发Android和iOS两套代码&#xff0c;开发成本高…

使用原生input模拟器样式正常,但是真机上 input框溢出

目录 一、问题 二、解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.使用原生input写了一个搜索框&#xff0c;在模拟器和pc上一切正常。但是打包放到手机上&#xff0c;样式就有问题&#xff1a;这个搜索框的布局是正常的&#xf…

pycharm管理仓库(Manager Repository)不见了

经常使用pycharm的大佬们都知道&#xff0c;pycharm中内置了很多库和包&#xff0c;很好用 但是下载来用自带的源很麻烦&#xff0c;于是就用国内的源 可以当我们添加管理仓库的时候&#xff0c;却没有了按钮&#xff0c;如何解决呢&#xff1f; 回到pycharm的主界面&#xf…

【C++】STL 算法 - 累加填充算法 ( 元素累加算法 - accumulate 函数 | 元素填充算法 - fill 函数 )

文章目录 一、元素累加算法 - accumulate 函数1、函数原型分析2、代码示例 二、元素填充算法 - fill 函数1、函数原型分析2、代码示例 一、元素累加算法 - accumulate 函数 1、函数原型分析 在 C 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 accu…

Unity3D代码混淆方案详解

背景 Unity引擎使用Mono运行时&#xff0c;而C#语言易受反编译影响&#xff0c;存在代码泄露风险。本文通过《QQ乐团》项目实践&#xff0c;提出一种适用于Unity引擎的代码混淆方案&#xff0c;以保护代码逻辑。 引言 在Unity引擎下&#xff0c;为了防止代码被轻易反编译&a…

AVL树 -- C++实现

AVL树 – C实现 1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1…

组件v-model(.sync)记录使用(vue3)

示例&#xff08;演示地址&#xff09; 以下是Vue3中使用v-model实现组件的双向数据绑定的示例代码&#xff1a; 首先&#xff0c;让我们来了解一下Vue3中v-model的用法。在Vue3中&#xff0c;v-model 指令可以用于自定义组件上&#xff0c;用于实现组件的双向数据绑定。与Vue2…

为什么选择HelpLook而不是Document360:知识库工具分析

在现今的信息化时代&#xff0c;企业们越来越倾向于使用知识库工具来收集、组织和分享他们的知识资源。HelpLook和Document360是市面上两款不错的知识库管理工具。那如果非要在他们之中选一个&#xff0c;还是建议HelpLook。以下是一些对比分析&#xff0c;希望可以给大家提供参…

Python通过HTTP代理进行数据传输

在Python中&#xff0c;HTTP代理是一种常用的技术&#xff0c;用于控制和修改HTTP请求和响应。通过使用HTTP代理&#xff0c;我们可以更好地控制网络请求的行为&#xff0c;提高安全性、隐私性和效率。下面我们将详细介绍如何在Python中使用HTTP代理进行数据传输。 一、设置HT…

tinyxml2

使用tinyxml2&#xff0c;得知道一些xml基础 xml tutorial--菜鸟 tinyxml2类对象 链接 结构 XMLNode 什么是节点 节点&#xff1a;元素、声明、文本、注释等。 XMLDocument xml文档(文件)对象。 作用&#xff1a; 加载xml文件&#xff0c; tinyxml2作用 先定义两个宏 …

Elasticsearch各种高级文档操作

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据查询所有文档匹配查询文档关键字精确查询文档多关键字精确查询文档字段匹配查询文档指定查询字段查询文档过滤字段查询文档概述指定想要显示的字段示例指定不想要显示的字段示例 组合查询文档范围查询文档概述使…

Redis+lua 解决秒杀超卖问题

商品超卖的原因是在高并发场景下,业务层面扣库存和库存的判断会出现并发情况&#xff0c;但是使用lua 脚本&#xff0c;就会避免超卖的发生。 1.在项目resources文件夹创建一个名为 stock.lua的脚本 if (redis.call(hexists, KEYS[1], KEYS[2]) 1) thenlocal stock tonumber…