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库并调用 的相关文章

  • 在 Android 中创建和使用 9 补丁图像

    我最近听说了 9 补丁图像 我知道它是 9 平铺的并且是可拉伸的 我想了解更多 如何创建 9 块图像 有什么工具吗 我可以通过 AndroidSDK 或代码创建它吗 9 patch 相对于普通 png 的主要优点 它是否可以根据屏幕动态 自
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • Android 上的 Firebase:如何检查 Firebase 身份验证失败原因?

    我在 Android 上使用 Firebase 和 Firebase Auth 功能 I try FirebaseAuth signInWithEmailAndPassword如果失败 我想知道为什么登录过程失败 The signInWit
  • 为什么我将可绘制文件重命名为 .9.png 后出现“Some file crunching failed”?

    我正在测试 9 patch 图像 在一切正常之前 我重命名drawable file ic button beat box default png to ic button beat box default 9 png 然后我收到错误 某些
  • 如何将 EditText 传递给另一个活动?

    Intent intent new Intent this Name class intent putExtra key et getText toString startActivity intent Intent intent getI
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 连接到不可发现的蓝牙设备

    我正在开发一个安卓应用程序 只是一个一般性问题 是否可以连接到公开不可发现的设备 提前致谢 如果您之前已与该设备配对 则即使该设备未处于可发现模式 也可以再次连接到该设备 参见这篇文章 以编程方式连接到配对的蓝牙设备 https stack
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • 没有调用addToBackStack,片段仍然添加到backstack,为什么?

    我正在制作我的片段更换器助手类 但我遇到了一些问题 我称之为FragmentChanger 它有一个fragmentContainer 这是一个ViewGroup 其中包含我想展示的所有片段 我已经做了我自己的replace Fragmen
  • Android ListView setSelection() 似乎不起作用

    我有一个ListActivity实现onListItemClick 并调用doSomething 类的功能 后者包含l setSelection position where l is the ListView object 现在有一个on
  • 加快 ImageView 中的缩放功能

    我目前正在处理非常大的图像 7 10mb 由于多种原因无法调整大小或压缩 现在 我们的想法是在自定义 ImageView 中显示它们 使用户能够进行双击缩放 捏合缩放等 我使用这个库来完成这项工作 https github com Mike
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • Android:确定 2.2 及更高版本上的摄像头数量

    我的应用程序需要在 Android 2 2 及更高版本上运行 我需要一种方法来确定可用摄像机的数量 有很多帖子解决了这个问题 但我找不到一个有效的 一种解决方案是简单地检测操作系统版本 任何 2 2 版本的设备都仅限于 1 个摄像头 即使该
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本
  • putFragment() - 片段 x 当前不在 FragmentManager 中

    上面的标题被问了很多次 但答案似乎与FragmentStatePagerAdapter这与我的问题无关 我正在使用该方法putFragment Bundle String Fragment 直接地 The 安卓文档 http develop

随机推荐

  • (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