在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

极空间NAS小白也能搞定的Gitea部署:Docker+MySQL避坑全记录

本文为极空间NAS用户提供了一份详尽的Gitea私有代码仓库部署指南。针对极空间ARM架构和图形化Docker管理的特殊性,文章重点讲解了如何通过Docker和MySQL容器进行部署,并提供了三种获取兼容镜像的实战策略,特别是利用第三方镜像站转录的方法,帮助小白用户成功搭建并初始化Gitea服务,实现私有Git托管。

weixin_28318011的博客 368

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

MySQL 优化 - index_merge 导致查询偶发变慢

今天遇到了一个有意思的问题,线上数据库 CPU 出现了偶发的抖动。定位到原因是一条查询语句偶发变慢造成的,随后通过调整表中的索引解决。优化器通过某种机制检测到 index_merge 能带来性能提升,某些情况下不会带来提升,反而会耗费更长的时间,属于优化器的缺陷,可以通过调整表中的索引来解决。

分享既学习 1255

VIPER22A实战:从零搭建15W非隔离电源,附BUCK电路调试心得

本文详细介绍了使用VIPER22A芯片从零搭建15W非隔离电源的全流程,重点解析BUCK电路设计与调试技巧。通过核心参数计算、PCB布局优化和效率提升方案,帮助工程师快速掌握DC-DC电源设计要点,实现高效稳定的电源转换。

redis7keeper的博客 669

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

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

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

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2066

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

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

display08的专栏 2053

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

在科研中用到EndNote管理文献,遇到插入文献时,中国知网如何将参考文献导进Endnote9.x或者web of sicence,谷歌学术如何将文章,文献导入进文献管理软件EndNote的详细图文2022版本解释,全网最细的笔记教程,值得大家参考收藏学习

sakura的博客 5177

ROS2多线程处理RTSP视频流避坑指南:OpenCV解码丢帧问题解决方案

本文针对ROS2中处理RTSP视频流时OpenCV解码丢帧的常见问题,提供了专业的解决方案。通过深入分析单线程模型的瓶颈,提出并详细拆解了基于生产者-消费者多线程模型的健壮实现方案,有效分离数据采集与处理,从而显著提升视频流的稳定性和流畅度。

weixin_29199873的博客 168

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

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

weixin_39781550的博客 403

二、FM1288调试方案-工具软件使用

分析音频数据的软件需要满足以下几点:1、能打开原始pcm音频文件;2、基本的音频播放软件的操作;3、能查看分析音频数据的频率成分;4、能查看分析音频音量幅度;5、能完成基本音频处理:降噪、音量增幅限幅、滤波和均衡;

优快云mianfeixiazai001的博客 1294

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

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

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

YOLOv13改进策略【Backbone/轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 671

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

yzpbright的博客 1201

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

while(true) 3052

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

多个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、付费专栏及课程。

余额充值