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

开发中经常会用到so库,大多是调用第三方的so库,偶尔也需要自己封装一个so库给别人调用,这边就记录一下开发so库的一个过程.

首先我们这边是在Android Studio中开发的,所以仅描述在Android环境下开发过程,当然也可以用其他工具开发.

目录

1.第一步新建项目,配置需要的工具

2.新建C++文件,编写代码

3.so库的类型

4.打包非JNI标准so库

5.打包符合JNI标准so库

6.打包完成


1.第一步新建项目,配置需要的工具

我们就先新起一个项目,创建项目的时候选择Native C++选项,新建完成之后有些地方还需要手动配置一下,例如NDK.对于so库不了解的同学大多数应该都没有安装本地NDK.这边给大家看下怎么安装,

在settings中选择SDK选项,往下拉会有NDK的列表,在这边可以选择需要下载的NDK版本.

然后我们找到项目的local.properties文件,这边加上一行,我这边用的是20.1.5948944版本,至于各位自己用什么版本,按照自己刚刚安装的版本填写就可以了,路径是NDK的下载路径.

如果这项已经存在了就不需要手动添加了.

2.新建C++文件,编写代码

在src/main/cpp目录下新建C++文件

新建的时候最好加上头文件,后面会用到.

然后我们打开CMakeLists.txt文件,在add_library中添加我们刚刚新建的文件,只要加cpp文件就可以了(头文件不需要加)

这时候我们就可以开始编写C++代码了,我们就写个最简单的功能,两个整数求和.

这时我们so库中需要的功能已经写完了.

3.so库的类型

对于安卓开发而言,so库有两种,第一种是不符合JNI标准的so库,第二种是JNI标准的so库

先来解释下什么是JNI,JNI全名: Java Native Interface,意思是Java本地接口

Java本身是不可以直接调用C++代码的,需要依靠JNI来调用C++代码

两种有什么区别呢

第一种不符合JNI标准的,需要提供so库和对于的头文件,这种写的时候方便,调用起来麻烦.

第二种符合JNI标准的so库,写的时候麻烦,调用起来方便.

至于需要哪种,各位自己看着办

4.打包非JNI标准so库

这类so库需要生成两种文件,一个是so库,还有一个是头文件,就是把外界需要调用的函数名和类暴露出来.

如果是这种so库,我们现在就可以直接打包了

Android Studio左上角选择Build->Clean Project,先把项目生成的一些缓存文件清理一下,然后选择Rebuild Project,把项目重构一下

这时会看到多出来几个文件夹,我们打开build文件夹

可以看到,在app->build->intermediates->cmake->debug->obj下有几个文件夹,这里面全是so库,这几个文件夹各不相同,可以全部复制过去,(如果不想全部复制,可以选择需要的ABI,怎么选择ABI?这个自己百度)

这边so库的名称和CmakeLists.txt中project("sodemo")是对应的.

注意,这类so库还需要头文件,要不然外面访问不到so库中的函数,头文件是哪个呢,就是这边的TestSo.h文件,直接复制出去即可.

总结一下就是需要给两类文件,一个是各个ABI对应的so库,一个就是头文件.

5.打包符合JNI标准so库

打包符合JNI标准的so库就有点麻烦了,需要自己手写JNI,

首先我们打开项目中自己生成的native-lib.cpp文件,这里面其实一开始是写了一个JNI函数的,我们可以依照那个写一个,

这边可以看到语法比较奇怪,我们挨个看一下

extern "C" JNIEXPORT jint JNICALL,这边是JNI固定语法,主要是jint,这个是就是我们返回的数据类型.

然后就是下面的函数名Java_com_example_sodemo_NativeTestSo_addition,这边com_example_sodemo就是包名,哪个的包名呢,就是NativeTestSo.java的包名,意思就是NativeTestSo.java这个类,要放在com/example/sodemo下面,这个是一定的,不能乱写

然后addition,这个就是NativeTestSo.java中对应的方法名,Java代码中调用的方法名

然后看到带了几个参数,JNIEnv *env, jobject , jint num1,jint num2,前两个JNIEnv *env, jobject是固定的,不用管,主要看后面两个,这两个就是NativeTestSo.java中addition方法传进来的两个参数.

简单组合一下就是

extern "C" JNIEXPORT 返回数据类型 JNICALL Java_包名_类名_方法名(JNIEnv *env, jobject,形参1,形参2...){}

然后按照上面打包so库的步骤执行一下,在app->build->intermediates->cmake->debug->obj就会出现直接可以用的so库了

6.调用

有一种额外的情况,就是我这的这段C++代码,不需要打包成so库给别人用,只在这个项目中使用

这时候就不需要像上面一样去打包so库了,直接新建一个Java类

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

然后就可以直接调用啦

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

7.下一篇,调用so库

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

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

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

相关文章

MFTCoder 重磅升级 v0.3.0 发布,支持 Mixtral 等更多模型,支持收敛均衡,支持 FSDP

1. MFTCoder 简介 CodeFuse在2023年9月开源了一种多任务微调框架——MFTCoder,它可以实现在多个任务上同时并行地进行微调。通过结合多种损失函数,我们有效地解决了多任务学习中常见的任务间数据量不平衡、难易不一和收敛速度不一致等挑战。大量实验结果…

『Open3D』1.10 Tensor数据处理

open3d中实现了自身的数据类型,用于open3d中内部算法的数值计算,但基础使用上与numpy类似。 目录 1、tensor创建 2、tensor数据属性 3、 Tensor数据在CPU与GPU上的转换

An incompatible version [1.2.33] of the Apache Tomcat Native library is installed

ERROR:An incompatible version [1.2.33] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.34] 意为:安装了不兼容的Apache Tomcat原生库版本[1.2.33],而Tomcat需要的版本[1.2.34] ERROR 14496 ---…

工业相机与镜头参数及选型

文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离(Worki…

表的增删改查 进阶(二)

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 3.新增 4.查询 聚合查询 聚合函数 GROUP BY子句 HA…

【GitHub项目推荐--一键换脸】【转载】

FaceSwap 是一种利用深度学习算法来换掉图片和视频中的人脸的工具。基于 Tensorflow、Keras 和 Python,Faceswap 可以在 Windows、macOS 和 Linux 上运行。 安装了这个应用,你就能在你电脑上通过可视化交互的方式构建自己的换脸模型了。 地址&#xff…

时序分解 | Matlab实现CEEMDAN+PE自适应噪声完备集合经验模态分解+排列熵计算

时序分解 | Matlab实现CEEMDANPE自适应噪声完备集合经验模态分解排列熵计算 目录 时序分解 | Matlab实现CEEMDANPE自适应噪声完备集合经验模态分解排列熵计算效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CEEMDANPE自适应噪声完备集合经验模态分解排列熵计算 运行环境m…

第六回 花和尚倒拔垂杨柳 豹子头误入白虎堂-安装服务器管理面板AMH和cyberpanel

且说鲁智深踏入菜园之时,二三十个泼皮无赖正聚集于此,他们手持果盒酒礼,脸上嬉皮笑脸,口称前来庆贺。然而,当这群人走到粪窖边缘,打头阵的张三和李四竟妄想搬动鲁智深,结果却被他轻描淡写地一脚…

element中表格组件的row-class-name和class-name属性的使用以及无效处理

1.这两个属性的使用&#xff0c;row-class-name用在el-table标签上&#xff0c;class-name用在el-table-column标签上。两个属性即可绑定类名也可绑定函数 <!-- 这里是绑定函数&#xff0c;也可以绑定类名 --> <el-table :data"tableData" selection-chang…

【C++】string的基本使用

从这篇博客开始&#xff0c;我们的C部分就进入到了STL&#xff0c;STL的出现可以说是C发展历史上非常关键的一步&#xff0c;自此C和C语言有了较为明显的差别。那么什么是STL呢&#xff1f; 后来不断的演化&#xff0c;发展成了知名的两个版本&#xff0c;一个叫做P.J.版本&am…

Liunx:线程控制

目录 创建线程&#xff1a;pthread_create(); 线程等待&#xff1a;pthread_join(); 线程退出&#xff1a;pthread_exit(); 线程取消&#xff1a;pthread_cancel() 说线程的时候说过&#xff0c;liunx没有选择单独定义线程的数据结构和适配算法&#xff0c;而是用轻量级进程…

关于java的继承

关于java的继承 我们在上一篇文章中&#xff0c;了解到了封装&#xff0c;我们本篇文章来介绍一下面向对象的第二大特点&#xff0c;继承&#xff0c;还是遵循结合现实生活中的实际情况&#xff0c;理解着去学习&#xff0c;能更好的加深印象&#x1f600;。 一、继承 继承的…

【从零开始学习Java重要知识 | 第三篇】暴打ReentrantLock底层源码

目录 前言&#xff1a; 前置知识&#xff1a; 什么是公平锁与非公平锁&#xff1f; 尝试自己构造一把锁&#xff1a; ReentrantLock源码&#xff1a; 加锁&#xff1a; 解锁&#xff1a; 总结&#xff1a; 前言&#xff1a; 在并发编程中&#xff0c;线程安全是一个重…

力扣 | 49. 字母异位词分组

这里使用HashMap Java package _49;import java.util.*;public class Problem_49_GroupAnagrams {public List<List<String>> groupAngrams(String [] strs){Map<String,List<String>> map new HashMap<>(); // int [] arr new int[]{}…

建筑能源管理系统

建筑能源管理系统是一种集成了先进的监测、控制、分析和优化技术的智能化系统&#xff0c;旨在提高建筑能源效率&#xff0c;降低能源消耗&#xff0c;减少环境污染&#xff0c;并为用户提供舒适、安全的建筑环境。通过监测建筑内的各种能源消耗情况&#xff0c;如电力、热水、…

Halcon基于形变的模板匹配

Halcon基于形变的模板匹配 形变分为两种&#xff0c;一种是基于目标局部的形变&#xff0c;另一种是由于透视关系而产生的形变。基于形变的模板匹配也是一种基于形状的匹配方法&#xff0c;但不同的是&#xff0c;其返回结果中不仅包括轻微形变的形状.形变的位置和参数&#x…

Python基础第二篇(Python基础语法)

文章目录 一、字面量二、注释三、变量四、数据类型五、数据类型转换六、标识符七、运算符八、字符串扩展内容&#xff08;1&#xff09;字符串定义&#xff08;2&#xff09;字符串拼接、&#xff08;3&#xff09;字符串格式化&#xff08;4&#xff09;字符串格式化的精度控制…

java spring cloud 企业工程管理系统源码+二次开发+定制化服务

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

【AI绘画+本地部署】基于krita的AI绘画(含windows一键整合包)

comfyuikrita所有相关资源整合包(无需下载后面链接)百度网盘&#xff1a;https://pan.baidu.com/s/1iwNRpdTaD26YbzSDm6WLDA?pwdbur8 –来自百度网盘超级会员V4的分享 krita绘画软件官网地址 https://krita.org/en/download/krita-desktop/ krita-ai-diffusion 插件&#xff…

python 自动化模块 - pyautogui初探

python 自动化模块 - pyautogui 引言一、安装测试二、简单使用三、常用函数总结 引言 在画图软件中使用pyautogui拖动鼠标&#xff0c;画一个螺旋式的正方形 - (源码在下面) PyAutoGUI允许Python脚本控制鼠标和键盘&#xff0c;以自动化与其他应用程序的交互。API的设计非常简…