Android studio的cMake编译生成.so库并调用

2023-11-10

第一步:添加工具
在SDK Tools中勾选安装CMake、LLDB、NDK。 其中的LLDB是调试本地代码的工具,可以调试C++代码!!!
第二步:创建一个最简单的官方demo,File——>New——>NewProject,选中最下方的Include C++ Support


这个项目是一个最简单是实用cMake编译c++生成.so的项目,此项目有几个关键点:
1.在src/main/cpp中存在native-lib.cpp文件,它是提供对外接口的,之后我们调用时就是通过一个java类调用这个c++文件中的接口的。
其中的extern “C”的作用是如果我们调用的除了c++还有c代码的话,需要在对应的接口方法前添加这句,进行转化调用。如果多个方法都包含有c代码,也可以这样做:

 

 

Java_com_jnitest_MainActivity_stringFromJNI这个是定义的接口样式,必须以Java开头,com_jnitest是你的包名,MainActivity是用java类加载.so以及声明调用方法的类名,不一定非要再activity中(不建议再activity中),可以创建一个类专门做此工作。stringFromJNI为调用的方法名。

2. build.gradle中

defaultConfig中
externalNativeBuild {
    cmake {
            cppFlags ""
            abiFilters 'armeabi','armeabi-v7a','x86'
    }
}

abiFilters可以设定生成哪几种abi,不写就是生成所有类型的

        android中
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }

        指定你的CMakeLists文件的位置
 

3.在app moudle下有一个CMakeLists.txt文件,此文件是CMake 构建脚本,名字不可更改,路径可以随意换,但是必须和build.gradle中的path保持一致。
其中add_library()中是制定需要生成的.so库的名字,这里demo是native-lib。
后面还有设置source file的,比如你要引用的其他c++/c代码。把具体某路径下的某文件名字添加上。

上面的为三个主要元素,准备完成之后点击Build——>Make project,完成后就会在app mould下的build——>intermediates——>cmake下生成对应的.so库了,可以把这些.so拷贝到libs或者jniLibs下使用即可。
注意:只能在native-lib.cpp中对应包名的项目中使用,否则会报错。也就是说不是任何一个项目都能直接使用你生成的.so库,前提是他的包名和上面1中的类名保持一致。

以上是cMake编译c++/c成.so库的最简单使用方式。但是我们往往在使用时需要多个c++/c的调用完成相关功能,但是对外的接口却只有一个类(native-lib.cpp),这就涉及到如何在native-lib.cpp中调用其他c++/c的代码了。在此demo的基础上做下扩展。

第一步:创建java对应的加载类。
这里不打算在activity中加载.so库,所以新建一个类专门做这件事,如图:


其中System.loadLibrary(”native-lib”)就是加载生成的.so库的,生成的.so库名字会自动加上lib前缀,我们写的时候不要把lib前缀加上。

public static native String encrypt(String param);就是我们调用的native-lib.cpp中声明的方法,需和native-lib.cpp声明的方法的最后一个下划线后面的名字保持一致。
第二步:添加需要的其他c++/c代码类。这里列举一个最简单的功能如图:

 

第三步:添加这个c++/c的头文件:如图

 

第四步:在native-lib.cpp中添加这个c++/c的依赖,相当于与java的导包,依赖的这个c++/c的头文件如图:

第五步:在CMakeLists.txt中加入这个c++/c的路径添加,如图:

 

第六步:在代码中调用,如图:

 

第七步:***clean项目然后Make project,run。在手机上就会看到实现的效果。如图:


按上述步骤即可实现使用Android studio cMake打包.so库,.so的路径在build——>intermediates——>cmake下,因为在自己项目中做,每次编译都会进行cMake操作,耗时也没必要。所以建议新建一个和自己项目的包名一致的项目专门生成.so库的工作,把生成的.so库引入到自己项目中使用即可。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android studio的cMake编译生成.so库并调用 的相关文章

随机推荐

  • (KVM)使用xml文件创建虚拟机

    编写xml文件并创建格式为qcow2磁盘镜像文件 编写一个centos7 xml xml文件存放在 etc libvirt qemu 目录下 这是虚拟机的启动文件 内容如下
  • 【NLP工具】hanLP2.1的使用(未完)

    目录 一 hanlp简介 二 安装hanlp 三 测试使用 四 hanlp的预训练模型 五 词性标注 六 命名实体识别 一 hanlp简介 面向生产环境的多语种自然语言处理工具包 基于PyTorch和TensorFlow 2 x双引擎 目标
  • Python NumPy 数组索引

    前言 NumPy Numerical Python的缩写 是一个开源的Python科学计算库 使用NumPy 就可以很自然地使用数组和矩阵 NumPy包含很多实用的数学函数 涵盖线性代数运算 傅里叶变换和随机数生成等功能 本文主要介绍Pyt
  • 微信小程序-- 三、视图与逻辑

    文章目录 三 视图与逻辑 1 声明式导航 1 跳转到 tabBar 页面 2 跳转到非 tabBar 页面 3 后退导航 2 编程式导航 1 跳转到 tabBar 页面 2 跳转到 非tabBar 页面 2 后退导航 3 导航传参 1 声明
  • python123习题集

    python123习题集 06函数 07集合 08列表元组 09集合 10字典 12随机数 06函数 二分法求平方根 tips 二分法求解思路 精度控制 import math n delta map eval input split de
  • 坑爹的jack-server

    平台 rk3288 安卓版本 android7 1 记录一次jack server编译踩坑之路 期间本人改端口 重装java 8 openjdk amd64 反正各种尝试搞了一周 人都给整郁闷了 网上各种方法都尝试遍了甚至重装了系统 1 重
  • 中科院三院士谈AI:人工智能的“脑洞”有多大?

    李德毅 中国工程院院士 中国人工智能学会理事长 我们今天的科学家 尤其是计算机科学家 把 计算 用得太狠了 对 计算 的依赖甚至有些 贪得无厌 了 人工智能学者不能只盯着计算认知 一味要求 人脑研究的步伐有多快 而要拿出更多的精力放在 记忆
  • QT修改ui界面后显示的还是原来的界面

    这个问题可能是由于你从其他地方复制来了源码或者是ui界面 导致 ui xxx h 头文件不能及时更新导致的 只需要将工程的编译目录 工程的编译目录不一定是你的文件所在的目录 下的ui xxx h文件全部删除 在重新编译即可 如果不行的话就将
  • 面向对象——this关键字

    this关键字简介 当创建一个对象成功后 在构造方法调用前 对象已经创建成功 虚拟机 JVM 会动态的分配一个引用 该引用指向的就是当前对象 这个引用的名字叫做this 在成员方法中 谁调用这个方法 那么this就指向那个对象 在构造方法中
  • (Java毕业设计)房产销售管理系统(java+mysql)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 Java毕业设计 目录 一 项目简介 二 系统项目部分截图 2 1注册登陆功能 2 2公告信息功能 2 3房屋信息展示 2 4系统管理员功能 三 论文目录 四 部分核心代码
  • nodejs中require的路径是一个文件夹时发生了什么

    node中使用require的时候如果路径是一个文件夹时 或者特殊的情况require require 这是node实战这本书里说的情况 但是我在node6 9版本中发现不完全是这样 可能是后来做了修改 下面说说在6 9下require路径
  • 基础算法:浮点二分——数的三次方根

    浮点数二分 求一个数的三次方根 include
  • 蓝桥杯打卡Day1

    文章目录 全排列 八皇后 一 全排列IO链接 本题思路 本题是一道经典的全排列问题 深度优先搜索即可解决 include
  • helm简介、安装、配置、使用指南

    转载自 https blog csdn net bbwangj article details 81087911 目录 helm简介 Helm 组件及相关术语 Helm Tiller Chart Repoistory Release Hel
  • H2支持mysql:MODE=MySQL

    连接字符串参数 DB CLOSE DELAY 要求最后一个正在连接的连接断开后 不要关闭数据库 MODE MySQL 兼容模式 H2兼容多种数据库 该值可以为 DB2 Derby HSQLDB MSSQLServer MySQL Oracl
  • 在 MySQL 中,如果要存储大文本数据,改如何选择

    在 MySQL 中 如果要存储大文本数据 可以选择以下两种数据类型 TEXT 适用于存储较长的文本数据 最大长度为65 535个字符 LONGTEXT 适用于存储非常大的文本数据 最大长度为4 294 967 295个字符 选择使用哪种类型
  • 【SQL】sql语句LEFT JOIN(拼接表)详解

    1 语法 SELECT column name s FROM table1 LEFT JOIN table2 ON table1 column name table2 column name 2 说明 按照一定规则 将表table1和表ta
  • Python——将字符串写入文本保存

    sResult为要写入的内容 一般是字符串形式 with open C Python37 911 txt w encoding utf 8 as f f write str sResult f close
  • stm32 利用定时器中断消除按键抖动

    button c int iButtonCount i代表int型变量 ButtonCount表示按键计数变量 int iButtonFlag i代表int型变量 ButtonFlag表示重按键标志 1代表重新按键 0为没有重新按键 int
  • Android studio的cMake编译生成.so库并调用

    第一步 添加工具 在SDK Tools中勾选安装CMake LLDB NDK 其中的LLDB是调试本地代码的工具 可以调试C 代码 第二步 创建一个最简单的官方demo File gt New gt NewProject 选中最下方的Inc