在Android中,将 .cpp 文件编译成共享库(.so 文件)

Android JNI编程并生成so库 android jni编程和学习 阅读详情

1. 安装 Android NDK


Android NDK Win10安装及环境变量配置(图文详细教程)

2. 创建项目结构


一般在AS你新建C++项目会默认如下结构目录,要是用现有项目,你也可以手动创建。

YourProject/
├── app/
│   ├── src/
│   │   ├── main/
│   │   │   ├── cpp/
│   │   │   │   ├── your_file.cpp
│   │   │   │   └── CMakeLists.txt
│   │   │   ├── java/
│   │   │   └── res/
│   ├── build.gradle
└── ...

3. 编写 CMakeLists.txt


在 cpp 文件夹中创建一个名为 CMakeLists.txt 的文件,该文件包含编译共享库的指令。

cmake_minimum_required(VERSION 3.18.1)

# 指定要编译的源文件
add_library( # Sets the name of the library.
             my_native_lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             your_file.cpp )

# 指定要链接的库
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the log library.
              log )

# 指定要链接的库
target_link_libraries( # Specifies the target library.
                       my_native_lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

4. 修改 build.gradle


在 app 目录下的 build.gradle 文件中,确保添加 CMake 的支持。

android {
    ...

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}

dependencies {
    ...
}

5. 同步项目


点击 Android Studio 顶部的 Sync Now 按钮,确保你的项目能够识别 CMake 配置。

6. 编译 .so 文件


  1. 点击菜单 Build -> Make Project 或者 Rebuild Project。
  2. 编译完成后, .so 文件会在 app/build/intermediates/cmake/ 目录下生成。
    在这里插入图片描述
    新建的C++项目默认都有上面代码,无需任何操作。

7. Android.mk 和 CMakeLists.txt


简单介绍下Android.mk,因为在JNI开发中,看到过它的影子

Android.mk

  • 定义: Android.mk是Android NDK(Native Development Kit)中使用的Makefile文件。它定义了如何编译本地代码,生成共享库或可执行文件。
  • 构建系统: 依赖于GNU Make,比较传统,适合简单的项目。

结构

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := my_native_lib
LOCAL_SRC_FILES := my_native_lib.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

include $(BUILD_SHARED_LIBRARY)

CMakeLists.txt

  • 定义: CMakeLists.txt是CMake构建系统的配置文件。CMake是一个跨平台的构建系统生成工具,能够生成本地构建文件(如Makefile或Visual Studio项目文件)。
  • 构建系统: 比Make更现代化,提供更多功能,适合大规模和复杂的项目。

总结

特性Android.mkCMakeLists.txt
构建系统GNU MakeCMake
复杂度简单,适合小型项目适合大型项目和复杂构建
跨平台支持限制良好支持
现代特性不支持现代C++特性支持现代C++特性
可读性对于复杂项目可读性较差更易读,更容易维护

简单概括,就是Android.mk过时了,一般在老项目中比较常见。

安卓逆向关于SO的关键点 导出表和导入表在共享库的动态链接过程中起着关键作用。导出表定义了共享库提供给外部使用的符号,而导入表则列出了当前模块所需的外部符号。理解这两个概念有助于更好地管理和使用共享库。JNIEXPORT是一个宏,通常在 JNI 头文件中定义。它的主要作用是确保在编译共享库(如.so文件)时,方法能够被 Java 虚拟机正确识别和调用。JNIEXPORT是 JNI 中用于定义本地方法的关键宏,确保方法能够被 Java 虚拟机正确识别和调用。它与JNICALL一起使用,确保调用约定的正确性。JNIEXPORT。 阅读详情

相关推荐

android CMake制作.so文件与跨平台引用

上一篇博客博客地址关于so文件的制作的是用ndkbuild命令执行,配置略显繁琐,且如果项目build升级到3.0,google便不在推荐使用此方式进行编译,而是使用最新的CMake工具进行编译,CMake对于上一种方式虽说简单了一些,但要熟练掌握还是有不小的难度的 1 NDK 简介 在介绍 NDK 之前还是首推 Android 官方 NDK 文档。官方地址 官方文档分别从以下几个方面介绍了...

刘国栋的博客 2999

Android so 的编译输出与使用

梳理一下在 Android 项目中包含 C/C++ 代码时,如何灵活的生成 so 文件。以及如何使用第三方提供 so 实现 C/C++ 代码的调用。

Gaga246的博客 1981

Android so库开发——Android Studio生成so库(一)

1)新建项目选择最下面的 Native C++ 下一步即可2)填写项目信息3)选择C++版本可以直接选择默认。

小旭的专栏 6926

Android Studio 编译C/C++生成.so文件

NDK

qq_45661948的博客 7365

【Android如何添加so库和bin可执行程序编译】

synaptics vs680平台添加so库和bin的编译方式

jiangchaobing_2017的博客 639

如何在 Android Studio 中将 C++ 文件编译为.so 库并供其他工程使用

在 Android 开发中,有时我们需要使用 C++ 编写一些高性能、底层的代码来完成一些特定的任务。为了方便在 Android Studio 中使用这些 C++ 代码,我们可以将其编译成动态库(.so),然后供其他工程使用。至此,你已经成功将 C++ 文件编译成了一个动态库供其他工程使用。以上就是如何将 C++ 文件编译为 .so 库并在其他工程中使用的详细步骤。在项目的根目录中创建一个名为“jni”的文件夹,用于存放 C++ 文件。的 C++ 文件,并编写相应的代码。加载了我们生成的动态库。

带你成为别人眼中的大佬! 821

NDK编程入门笔记[转]_我是亲民_新浪博客

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Andro...

maxma的博客 92

Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化

组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。

weixin_45719141的博客 1万+

cygwin+ndk+eclipse下JNI技术入门

[b]1、JNI的编写步骤[/b] 1)编写带有native 声明的java类. 2)编译java文件成class类 3)使用javah -jni com.ikags.project.XXXX 编译成.h文件 4)使用C/C++编写代码 5)编写makefile文件,将.h和.c(.cpp)文件编译成.dll(.so)文件 6)将.dll(.so)文件提供给项目,用system.loa...

流星的博客 179

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 447

Mac本地大模型实战指南:Ollama+Metal+Apple Silicon深度优化

大语言模型(LLM)本地化部署正成为开发者关键技术能力,其核心在于推理效率、硬件适配与成本控制。Apple Silicon凭借统一内存架构(UMA)和Neural Engine,为本地LLM运行提供了独特优势;Metal加速则显著提升GPU计算吞吐,使Gemma 4、Qwen 3.5等模型在M系列Mac上实现低延迟、高精度、离线可用的工程落地。相比云端API,本地方案规避了token计费、网络依赖与数据外泄风险,特别适用于企业文档处理、实时语音分析、私有知识库检索等强隐私、低时延场景。本文聚焦Mac平台,系

weixin_33443333的博客 352

c++封装so库,供安卓android调用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

刚入视频监控行业的菜鸡2090741348 8782

UE游戏引擎材质简单入门

什么是物体的材质,材质属性定义了物体的某些特性,从而决定了物体表面是如何与光线相作用的。UE中物理基础渲染(Physically Based Rendering OR PBR)几乎可以让我们模拟显示世界中的任何材质。那么如何在UE中制作出真实的PBR材质,基于我们提供的游戏引擎插件,如何将这些材质资源导出,并应用到 SuperMap iClient3D for Cesium/WebGL 平台上,提升模型的显示效果呢,下面小编将详细讲解一下。

m0_71055362的博客 2511

C++开发支持Android共享库(so)教程

C++开发支持Android共享库(so)教程 概述: Android是运行于Linux上的移动系统,Android开发语言是java,Linux开发语言是C/C++。虽然google和java为Android提供了大部份功能库和SDK,但在一些情况下还是需要使用C++开发一些功能供Android调用,扩充Android功能。比如我们需要开发特有的功能库,但这样的库java没有提供;比如我们需...

display08的专栏 2053

mcgs数据导出到U盘

mcgs触摸屏在工业中应用还是很多的,尤其他的脚本功能策略功能等将开放性放到了最大,让用户可以根据实际需求进行自由创作,正因为这样,对一些初学者就不是很友好,初学者想要简单操作就能实现功能,但是mcgs不可能两者兼备,在做工业设备,一些数据的采集保存就比较常见,但是mcgs没有相关按钮能够直接实现将数据导出到U盘的功能。这里我给大家讲解关于mcgs将报警历史记录、日志记录、历史数据记录导出到U盘的方法。

qq_24866535的博客 6235

ConnectionResetError 10054 根因分析与全链路防御指南

ConnectionResetError(错误码10054)是TCP协议中服务端主动发送RST包导致的强制断连,本质并非网络连接失败,而是服务端基于空闲超时、连接满载、TLS协商失败等策略做出的确定性终止决策。理解其底层原理有助于跳出‘重试’误区,转向连接生命周期管理。该错误高频出现在HTTP长连接、WebSocket、第三方API对接等场景,尤其在Nginx反向代理、负载均衡器(如AWS ALB)、WAF设备及内核conntrack机制下极易触发。本文结合Wireshark抓包分析、客户端心跳保鲜、协议指

weixin_30225755的博客 639

cmake编译成.so文件_Android studio项目添加c++文件

前言Android studio工程中经常会用到native 方法,方法之一是在libs文件夹中引入so文件,这样需要用到native方法的类直接调用如下方法加载库即可:System.loadLibrary("test-lib");如果不想引用so文件,想要直接在AS中实现native方法也是可以的。此时需要在项目中添加cpp文件,且需要做相关的配置,下面详细说明。概述环境准备要想在AS中编译cp...

weixin_39781550的博客 403

激光雷达点云配准:ICP与NDT算法详解

激光雷达点云配准:ICP与NDT算法详解​ ,人工智能,计算机视觉,大模型,AI,本文深入解析激光雷达点云配准的ICP与NDT算法。阐述了点云配准基础概念与评价指标,详解ICP算法原理、流程、最优变换矩阵计算、优缺点及改进版,给出Python代码示例;同样解析NDT算法的原理、流程、模型构建、优缺点、参数选择与代码示例。还对比两者在精度、效率、鲁棒性和适用场景的差异,提供算法选择建议,介绍实际应用案例、常见问题及解决方法,探讨算法发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

Unity与 SO 交互 ☀️| .so文件(动态链接库 ) 基础知识科普

因为最近用到了so文件相关内容。所以来学习一下.so文件相关的知识,正好来写博客也当是记录并分享一些知识。 最终目的是在Unity中与so文件进行交互处理,但是本篇文章需要先对so文件有一个基本的认识。

努力前行,总会成为自己心中的那道光 4967

整理 钢琴 约翰汤普森-简易钢琴(小汤)

文件名:(小汤1)约翰-汤普森钢琴1 超清PDF (原版引进)文件名:(小汤2)约翰-汤普森钢琴2 超清PDF (原版引进)文件名:(小汤3)约翰-汤普森钢琴3 超清PDF (原版引进)文件名:(小汤4)约翰-汤普森钢琴4 超清PDF (原版引进)文件名:(小汤5)约翰-汤普森钢琴5 超清PDF (原版引进)文件大小:20.1 MB。文件大小:23.7 MB。文件大小:45.7 MB。文件大小:51.7 MB。文件大小:72.0 MB。

TS的博客 5万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

so库是编译成的二进制文件?

deepseek回答: so库是被编译成的二进制文件,并针对特定的应用程序二进制接口(ABI)进行优化,以确保在不同硬件架构上兼容运行‌12。以下是关键细节:📦 so库的编译本质 ‌二进制文件形式‌:so库(动态链接库)本质是预编译代码的二进制集合,通过编译器(如Android NDK)将C/C++源码转换为可直接执行的机器码文件(.so格式)‌2。例如:编译后的.so文件包含特定指令集架构(如ARM或x86)的二进制指令。 这种形式避免了源码重复编译,可直接被程序调用执行‌4。 ‌ABI的核心作用‌:A

yzpbright的博客 1201

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用NDK编译C/C++文件生成在安卓中的可执行文件

要编译一个C文件,然后将他运行到安卓手机中,通过这个可执行文件可以获取一些硬件的参数信息,或者对已经有的信息进行修改,从而达到我们想要的效果

while(true) 3052

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

多个cpp文件生成so_Android studio如何利用Android.mk编译生成多个so文件

我们这次不用gradle 去生成SO文件,改用Android.mk 去编译。一共分为2步:1.在Java中编写要调用的静态方法和需要加载的库,并生成头文件。2.配置gradle3.配置Android.mk文件和application.mk文件下面一步步的走:首先需要在Java类中声明要调用的方法,以及要加载的库,我们在包下新建一个jniUtil类,如下所示public class jniUtil ...

weixin_36064575的博客 808

【NDK】【003】将C++代码编译为dll共享库

什么是共享库 C++代码可以编译成类库,直接分发给其它应用调用,这使得可以很容易地将自己的代码以库文件的形式共享给他人使用,同时还能保护源码不泄漏 C++共享库在Windows中以dll文件的形式存在,而在Linux系统中则以so文件的形式存在,这两种文件想必大家都不陌生,其实它们都是C++共享库,只是适用于不同平台的软件,并且都可以被JNI调用 将C++代码编译为共享库 由于AndroidStu...

天天向上 Up Up Up (*^▽^*) 1699

FoundationDB 中的 POSIX 共享库延迟加载利器:Implib.so 原理与实战指南

本文围绕 FoundationDB 仓库中 [contrib/Implib.so](https://link.gitcode.com/i/0f53a00c99235ec9ab5a2c22a9a7082d) 目录下的 Implib.so 工具展开,讲解如何在 Linux/Android 上为共享库(`.so`)自动生成"导入库"(import library / shim)代码,实现按需延迟加载(l

gitblog_00478的博客 1134

Android NDK 集成调用第三方SO库(标准SO库和非标准SO库)

想要进阶高级Android开发工程师,NDK开发是必须要掌握的技能之一,本文以集成第三方SO库为开端,带大家入门NDK开发,主要包含一下内容:1、NDK工程创建;2、编写和打包Android标准SO库;3、集成Android标准SO库;4、集成Android非标准SO库。

sziitjin的博客 2733
上一篇: 技术成神之路:二十三种设计模式(导航页)
下一篇: Android之Linux命令速查
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值