关于NDK

news2024/9/21 19:38:08

libc++_shared.so

在目前ndk的最新版本25.1.8937393中有4个libc++_shared.so,用Everything搜索结果如下:
在这里插入图片描述
可以看到,大小最小的有4M多。

对于libc++库,官方介绍在此,摘取一些片段如下:

LLVM 的 libc++ 是 C++ 标准库,自 Lollipop 以来 Android 操作系统便一直使用该库,并且从 NDK r18 开始成为 NDK 中唯一可用的 STL。


libc++ 的共享库为 libc++_shared.so,静态库为 libc++_static.a。通常情况下,构建系统将根据用户需要对这些库的使用和打包进行处理。


注意:libc++ 不是系统库。如果您使用 libc++_shared.so,就必须将该库添加到您的应用中。如果您使用 Gradle 构建应用,此步骤会自动完成。

接下来我们来验证一下最后一句话:如果您使用 Gradle 构建应用,此步骤会自动完成。

使用Android Studio的向导创建一个Native C++项目,自动创建的mative-lib.cpp文件如下:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_cn_dazhou_hello_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

然后运行到模拟器,然后执行:构建 > Analyze Apk…,然后选择我们的app-debug.apk进行分析,如下:
在这里插入图片描述
如上图所示,产生的libhello.so大小为114.5KB。这里我们看不到libc++_shared.so,这是因为CMake构建工具默认使用c++_static进行编译的,也就是说会把用到的libc++_shared.so中的相关内容编译到libhello.so中,注意,只是编译用到的相关内容而已,这也是为什么libhello.so只有114.5KB,而libc++_shared.so有4M以上,我们可以配置CMake不使用c++_static,而使用c++_shared,如下:

plugins {
    ...
}

android {

    ...
    
    defaultConfig {
        applicationId "cn.dazhou.hello"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"
                cppFlags '-std=c++17'
            }
        }
    }

    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.18.1'
        }
    }

    ...
}

dependencies {
	...
}

关于cmake的更多参数在此。
这个参数配置的写法我是参考的是这个。

再次运行app,然后再查看apk的分析,如下:
在这里插入图片描述
如上图所示,此时就能看到libc++_shared.so了,大小为370.3KB,而libhello.so的大小只有17.3KB。

如果应用包括多个共享库,应使用 libc++_shared.so,比如多个Android库有依赖关系,每个库都使用到了libc++,则应该使用c++_shared的方式编译,这样 libc++_shared.so的内容就不会被重复打包到多个so中了。多个库中的 libc++_shared.so最好保持使用同一个版本,因为最终打包apk时只会选择其中一个 libc++_shared.so打包到apk中。

在 Android 系统中,NDK 使用的 libc++ 与操作系统的 libc++ 是不同的(也就是说Android系统本身内部就已经有libc++的实现了)。如此一来,即使应用以旧版 Android 为目标平台,NDK 用户也能获得最新的 libc++ 功能和 bug 修复。需要权衡的是,如果使用 libc++_shared.so,就必须将该库添加到您的应用中。如果使用 Gradle 构建应用,此步骤会自动完成。 早期使用ndk-build进行编译的时候,是不会自动使用 libc++_shared.so的,则默认使用的是系统内部自带的libc++库,比如该系统自带的libc++的版本是C++11,而我们写的C++代码使用到了C++17,则此时运行就会报找不到函数实现,所以需要使用ndk中支持c++17版本的libc++_shared.so实现,如果是用ndk-build编译的就需要指定添加该so,如果是使用gradle编译,则会自动使用对应的so,无需要手动设置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django养生药膳推荐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java学习多态之向下转型

目录 语法 注意事项 一、 二、 三、 举例说明 注意事项第二条的解释 总结 向下转型&#xff1a;解决向上转型中不能调用子类特有成员的问题 语法 子类类型 引用名 &#xff08;子类类型&#xff09;父类引用&#xff1b; 注意事项 一、 只能强转父类的引用&#x…

Windows子系统WSL2 (ubuntu安装 docker、nvidia-docker)

文章目录一、准备二、安装WSL2三、安装docker nvidia-docker附录&#xff1a;WSL与linux路径映射一、准备 第一步&#xff1a;【win R】输入winver 检查你的 Windows 版本&#xff0c;验证内部版本是否低于19041, 升级系统选择Dev 渠道 第二步&#xff1a;【控制面板】>…

基于RRT算法的最优动力学路径规划(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 RRT是Steven M. LaValle和James J. Kuffner Jr.提出的一种通过随机构建Space Filling Tree实现对非凸高维空间快速搜索的算法。…

这款台灯,不仅能护眼,还能点读和互动

疫情反复&#xff0c;孩子不能正常返校 天天在家上网课、写作业 长时间用眼引发视疲劳 用眼健康需要格外关注 想要改善孩子的用眼环境 CTWing物联网市场推荐使用 好记星智能学习台灯 国AA级护眼标准&#xff0c;能点读&#xff0c;会说话 这款智能学习台灯好在哪里&…

旅游网站毕业设计,旅游网站网页设计设计源码,旅游网站设计毕业论文

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的景区景点购票系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于python的Django框架下开发&#xff1b;管理员通过后台录入信息、管理信息&#xff0c;设置网站信息&#xff0c;管理会…

186页13万字智慧能源大数据分析平台建设方案

目录 智慧能源大数据分析平台及能源集团数字化平台建设方案 目录 一、相关项目背景 二、需求理解 2.1 需求理解 三、方案设计 3.1 整体方案设计 3.3.1 整体架构 3.3.2 解决方案说明 3.3.3 需求应答 3.2 数据仓库 3.2.1 数据仓库架构 3.2.2 数据仓库产品说明 3.2.3…

高通平台开发系列讲解(AI篇)SNPE工作流程介绍

文章目录 一、转换网络模型二、量化2.1、选择量化或非量化模型2.2、使用离线TensorFlow或Caffe模型2.3、使用非量化DLC初始化SNPE2.4、使用量化DLC初始化SNPE三、准备输入数据四、运行加载网络沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍SNPE模型工作…

十万部冷知识:为什么会有点球大战?

在上一部的“冷知识”当中&#xff0c;我们跟大家提到了在小组赛中决定排名的方法&#xff0c;比到最后哪哪都平的情况下&#xff0c;甚至都会以抽签的方式决定。 但是到了淘汰赛里&#xff0c;往往就不会这么儿戏了。双方在常规时间和加时赛都打平的情况下&#xff0c;会直接进…

《自己动手写CPU》学习记录(1)——第1章

引言 此专栏的文章记录自己学习《自己动手写CPU》的过程。算是一个学习笔记&#xff0c;里面也会夹杂个人的思考以及代码编写。希望自己可以像作者一样&#xff0c;坚持到最后。加油~~ 本篇学习MIPS32处理器的基本架构。 致谢 感谢书籍《自己动手写CPU》及其作者雷思磊。一…

注册ChatGPT全攻略

参考: 最近ChatGPT很火&#xff0c;但有人注册会经常出现不服务当区域问题&#xff0c;现在把手教你解决。 准备 代理&#xff0c;要求是&#xff0c;韩国&#xff0c;日本&#xff0c;印度&#xff0c;新加坡&#xff0c;美国这几个地址。其他的不太清楚&#xff0c;反正香港…

开关电源环路稳定性分析(03)-开环电源

大家好&#xff0c;这里是大话硬件。 在前面的章节中&#xff0c;分析了开关电源为什么需要闭环环路控制&#xff0c;并且得出了开关电源需要稳定可靠&#xff0c;就必须增加环路控制的结论。虽然目前开关电源环路控制的方法很多&#xff0c;但是较常用的是电压控制方式。 这一…

联表查询之交叉连接、内、外连接

目录 1、交叉连接&#xff08;笛卡尔积&#xff09; 2、内连接 2.1 显示内连接&#xff08;inner join&#xff09; 2.2 隐示内连接 2.3 内连接的练习 2.3.1 查询第一或者二学期中所有的学生 2.3.2 查询第一和第二期所有的学生 2.3.3 查询每个班级下的学生总数&#xff0c;…

目标检测 YOLO5部署安装测试

一、下载模型 yolov5: 同步更新官方最新版 Yolov5 &#xff0c;发行版提供模型下载地址 (gitee.com)https://gitee.com/monkeycc/yolov5?_fromgitee_search二、导入需要的包 pip install -r requirements.txt -i https://pypi.douban.com/simple/三、下载模型yolov5s.pt放到根…

Java进阶——多线程基础

文章目录线程基础1、线程介绍1.1、线程相关概念2、线程基本使用创建线程的两种方式&#xff1a;2.1、 继承Thread 类&#xff0c;重写run方法2.2、实现Runnable接口&#xff0c;重写run方法2.3、多线程的简单演示&#xff1a;2.4、继承Thread 和实现Runnable 的区别2.5、线程终…

基于鲸鱼算法优化的lssvm回归预测-附代码

基于鲸鱼算法优化的lssvm回归预测 - 附代码 文章目录基于鲸鱼算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于鲸鱼算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对…

行列式基础

进阶版&#xff1a;&#xff08;努力更新中&#xff09; 二阶行列式 我们先来看看二元一次方程。 {a1,1x1a1,2x2b1a2,1x2a2,2x2b2\left\{ \begin{matrix} a_{_{1,1}} x_{_1} a_{_{1,2}} x_{_2} b_{_1} \\ \\ a_{_{2,1}} x_{_2} a_{_{2,2}} x_{_2} b_{_2} \end{matrix} \ri…

[附源码]计算机毕业设计葡萄酒销售管理系统论文Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【算法篇】利用堆高效解决大数据量时TOP-K问题

Top-k问题1.问题描述2.分析问题3.思路4.复杂度分析5.代码实现6.总结堆相关博客&#xff1a; 堆1.问题描述 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前…

C语言第十九课:补充知识——函数栈帧的创建与销毁

目录 前言&#xff1a; 一、寄存器&#xff1a; 二、函数栈帧的创建与销毁&#xff1a; 1.main函数函数栈帧开辟的准备&#xff1a; 2.main函数函数栈帧的开辟&#xff1a; 3.Add函数函数栈帧的开辟&#xff1a; 4.Add函数函数栈帧的销毁&#xff1a; 5.main函数函数栈帧的销…