首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android C++ 系列:NDK 减少 so 库体积方法总结

比如为了做本地存储引入了一个 Sqlite 的动态库,我们本身也用不到本地存储,像闹钟设置之类的放到 APP 层即可,而且就算是需要存储也完全可以使用 Android 和 iOS 平台提供的 Sqlite...这里我们使用 Android 平台提供的 Jni 层的媒体库来做音频解码。而且即使是 Android 平台 JNI 层不支持,也可以单独依赖一个 mp3 解码库,而不是庞大的 ffmpeg。...◆ 设置编译器的优化 flag 编译器有个优化 flag 可以设置,分别是-Os(体积最小),-O3(性能最优)等。这里将编译器的优化 flag 设置为-Os,以便减少体积。...编译器可以配置自动去除未使用的函数和变量,以下是配置方式: CMake: # 去除未使用函数与变量set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections...所以只要对函数加上这个宏,像这样: // JNIEXPORT就是控制可见的宏// JNICALL在NDK这里没有什么意义,只是个标识宏JNIEXPORT void JNICALL Java_ClassName_MethodName

1.7K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android 工程管理与定制

    由于Android编译管理工具有早期的ndk-build和cmake两套方案,ndk-build方案实际上是借助Android.mk(类似makefile)来管理编译。...而cmake方案是借助cmakelist.txt来管理编译(cmake方案源于PC端跨平台方案),由于目前Android studio默认采用的cmake方案,故本仅仅文针对cmake方案作为讲解。...图5 指定CPU架构版本 三、生成so和引用so,编译so的相关配置 在老的nd_build编译框架下修改的是Android.mk,不再赘述,在新的cmake框架主要修改的是cmakelist.txt。...native-lib.cpp ) //编译器输入的源文件 //指定本工程引用的第三方库,可能交叉编译出来的库,也可能是ndk编译出来的 find_library( # Sets the name of...该插件选择的是最新下载的 NDK 版本。使用模块的 build.gradle 文件中的 android.ndkVersion 属性可替换插件选择的默认版本。

    40020

    手把手教你如何在Android下进行JNI开发(入门)

    下面我将从Android.mk和CMake这两种方式教大家如何进行开发。文章结尾将给出演示的项目代码,如果你能耐心地仔细看完,相信你一定能掌握如何在Android下进行JNI开发。...(3)LOCAL_MODULE:调用的库名,用来区分android.mk中的每一个模块。文件名必须是唯一的,不能有空格。注意,这里编译器会为你自动加上一些前缀lib和后缀.so,来保证文件是一致的。...在默认情况下,NDK通过Androoid自带的最小化的C++运行库(system/lib/libstdc++.so)来提供标准C++头文件.然而,NDK提供了可供选择的C++实现,你可以通过此变量来选择使用哪个或链接到你的程序...下面我将介绍Android Studio着重推荐的CMake方式进行JNI开发。...(2)NDK:这套工具集允许为 Android 使用 C 和 C++ 代码。 (3)CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。

    4.5K10

    【Android面试速学】JNI 了解一下?

    说明一下这篇文章的内容和目的: 了解JNI 在开发中的基础使用 Java 代码和 c++ 的native 方法链接原理 JNI 框架是啥,都有哪些东西 Ndk 是什么东西?...我们JNI的大多数操作都是通过其进行。 NDK是啥,和jni什么关系?...ndk:Native Development Kit Android NDK 支持使用 CMake 编译应用的 C 和 C++ 代码。 NDK是一系列工具的集合。...NDK可以为我们生成C/C++动态链接库。 我们对于native的开发是基于ndk的开发。 ndk和jni没什么关系,只是基于ndk开发的动态库,需要通过jni和java进行沟通。...怎么构建so库?ndk支持通过cmake实现代码编译构建。 ndk和jdk的区别? 只有学习才能是我成长,只有学习才能是我进步,我要好好学习,为建设祖国贡献一份力量~~~ 参考文章:

    11710

    NDK 开发环境配置

    安装 CMake、LLDB与NDK 开发工具包 CMake 简介 CMake 是一款比make更强大的编译自动配置工具。...它可以根据不同平台、不同的编译器,并通过CMakeLists.txt文件中简单的语句来描述所有平台的编译过程,生成相应的Makefile文件或project文件。...CMake的优势 允许直接在C/C++代码中加入断点,调试; 在Java层中使用“ctrl+左键”快捷键能够直接进入本地方法对应的C/C++代码中; 在C/C++中使用“ctrl+鼠标点击”快捷键能够直接进入头文件或库...         # 生成函数库的名称,即libnative-lib.so或libnative-lib.a(lib和.so/.a默认缺省)        JNILearning         #生成库类型...        # 设置path变量的名称,这里为NDK中的日志库         log-lib         #指定cmake查询库的名称         #即在ndk开发包中查询liblog.so

    1.9K10

    Mac下Android Studio 3.x的NDK开发环境搭建

    这里有一篇旧文-Mac下安装配置Android Studio 2.x和3.x并配置使用adb可供参考....而写这篇的目的, 主要是我发现之前的ndk开发方式已经过时了, 需要更新一下新的流程. ---- CMake CMake的方式是官方默认的ndk构建方式, 先从默认栗子开始看吧....C++ 来看看项目都多了什么, 先切换到Android标签下, 多了cpp目录(ps: 注意, 这里就算切换到Project标签, 依旧是cpp哈), 一些头文件, 和native-lib.cpp,...效果图 ---- ndk-build 这是个有些过时的方式, 但是依旧是可以用的, 同样, 新建空项目. 然后和之前一样, 建一个cpp/jni目录....效果图 ---- 最后 要说操作上这两种的复杂度感觉差不多, 但是我依旧推荐CMake方案, 至少这种是短时间不会过时的方案.

    1.2K30

    面向 C++ 的现代 CMake 教程(二)

    但是有一个问题;与可执行文件和库目标不同,自定义目标只有在它们被添加到依赖图时才会构建。我们来了解一下那是怎么回事。 依赖图 成熟的应用程序通常由许多组件组成,我这里不是指外部依赖。...我建议使用这些INTERFACE目标,因为它们可以提高代码的可读性和可重用性。把它看作是将一串魔法值重构为命名良好的变量。我还建议使用_props后缀以便于区分接口库和常规库。...否则,什么都不做。 接下来,我们可以用enable_rtti接口库链接我们的库和可执行文件。如果编译器支持,CMake 将添加-rtti标志。...我们搜索哪些目录以及按什么顺序?不幸的是,C++标准并没有确切指定;我们需要查看我们使用的编译器的手册。 通常,尖括号形式将检查标准包含目录,包括系统中存储标准 C++库和标准 C 库头文件的目录。...这就是为什么我们应该非常小心地设置我们的环境,使这个过程尽可能容易和可忍受。我们通过使用target_compile_options()配置编译器来实现这一点。那么编译选项能帮助我们什么呢?

    70500

    CMake vs Make对比

    编写程序时,应该为其编写一个makefile,以便可以使用“Make”来构建和安装程序。简单的东西!如果您不明白,请再次阅读该段落,因为下一部分重要。 为什么我们需要“Make”?...您还可以使用“Make”来控制安装或卸载软件包,为其生成标签表, CMake的 CMake代表跨平台制作。CMake识别哪个编译器用于给定类型的源。...如果您不知道,您不能使用相同的编译器来构建所有不同类型的源。您可以在每次建立项目时手动执行,但这将是乏味和痛苦的。CMake为每种类型的目标调用正确的命令序列。...处理包含头文件,库等的所有常见的编译器/链接器标记都被平台独立的和构建系统无关的命令所取代。...当将CMake与Make进行比较时,使用CMake有几个优点: 跨平台发现系统库。 自动发现和配置工具链。 将文件更容易地以平台的方式将文件编译到共享库中,并且一般比make更容易使用。

    4.1K31

    近期cmake-toolset的一些适配问题

    在我的测试中 Clang 6.0 版本(对应AppleClang 版本10.0)带的 libc++ 才开始能够正常使用这个接口。所以在这些老的编译器下需要降级到 v3.13.0 。...这样可以最大限度地共享已有的编译缓存;另外优化了一些重置cmake会用到的环境变量的脚本。因为有些构建流程会通过设置环境变量来影响构建选项。 gRPC 对新版本的编译器适配也有一些问题。...abseil-cpp 会在自带的STL支持的时候使用STL版本的标准库,否则才是使用 abseil-cpp 内的版本。 虽然这是编译器的问题,但是我们也不得不打Patch绕开他。...支持 Android NDK r23 Android NDK r23 是当前最新的LTS版本,里面的 android.toolchain.cmake 锁提供的信息和NDK的目录结构和之前的版本有比较大的变化...详情就不列举了,大致上就是一些平台相关的变量和新的NDK没有platform目录了。这个目录以前是放不同版本的的一些基础库文件的。

    94440

    深入理解使用CMake编译 NDK 程序

    ---- 使用 CMake 进行Android NDK编译的原理 ---- ?...介绍 Android Studio 2.2 及以后的版本默认使用CMake进行 NDK 编译, 其中最吸引人的地方是,在开发NDK程序时可以进行联机调试,这真是大在的方便了开发者开发NDK程序的效率了。...那么使用CMake编译NDK程序是否与我们之前介绍的使用ndk-build编译有很大的不同呢?下面我们就来一窥它的原理。...前面我给大家介绍了两种交叉编译的方式,没看过的同学可以浏览一下( Linux/Mac 交叉编译 Android 程序 和 深入理解Android NDK编译(一) ) 什么是CMake CMake是个开源的跨平台自动化建构系统...虽然名字中含有"make",但是CMake和Unix上常见的“make”系统是分开的,而且更为高级 Android Studio 如何使用 CMake 其实通过 CMake 进行 NDK 交叉编译的方式与我们之前介绍的两种方式的原理是相同的

    4K30

    Android进阶-NDK技术

    一.介绍   1.什么是ndk技术?     ...那么,NDK技术和它有什么关系呢?NDK是一种用于开发Android应用程序的工具集,它允许开发者使用C/C++编写部分或全部的Android应用程序代码,以便提高性能和访问底层系统功能。...确实如此,用一句话概括它们之间的关系就是:开发者使用NDK技术在Android应用程序中编写C/C++代码,并将其编译成共享库(如.so文件),然后使用JNI技术在Java代码中加载并与这些C/C++代码进行交互...2.为什么要学习ndk?     第一点的话就是提高性能了,这个显而易见,C/C++的性能肯定比Java高,如果有些功能用Java实现性能不行,就可以把这部分代码用C/C++实现。...log) //使用find_library来查找log库,并把找到的log库存储在变量log-lib中 # Specifies libraries CMake should link to your

    45230

    Android JNI学习(二)——实战JNI之“hello world”

    与build.gradle文件指示Gradle构建应用一样,CMake和ndk-build需要一个构建脚本来了解如何构原生库。...PS:这里注意一点就是:Instant Run 与使用原生的项目不兼容 如果想看Gradle是否将原生库打包到APK中,可以使用Analyze APK来检测。...其实没关系的,CMake也提供这样的功能的,现在我们就回到上面的第一个demo中,删除和NDK的有关的所有代码,删除后其目录如下: ?...如下图 3、在下拉菜单中选择CMake。使用Project Pat来为外部的CMake项目指定刚刚的``CMakeLists.txt`脚本文件 4、点击OK。 ?...结果3.png 八、使用experimental-plugin插件简介 我们在使用NDK开发有件比较麻烦的事情,就是编写Android.mk和Application.mk,儿Android Studio

    2.6K42

    Android NDK编程(二)---CMakeList.txt详解

    前言 前一篇我们介绍了《Android NDK编程(一)---NDK介绍及环境搭建》,简单介绍了一下什么是NDK和JNI,以前NDK环境的配置及怎么创建第一个NDK的程序,在上一篇的左侧栏中有一个CMakeList.txt...CMake简介 CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。...========================= #设置动态依赖库1 # 添加动态库,为了android版本之间的兼容性,需要设置一个变量 # CMAKE_CXX_FLAGS c++的参数 会传给编译器...externalNativeBuild { cmake {arguments "-DANDROID_TOOLCHAIN=clang", //使用的编译器clang/gcc...,效果和之前的cmakelist里使用一样 cppFlags "" //指定需要编译的cpu架构 abiFilters

    3.4K32

    Assimp Android 编译

    本文详细介绍如何编译适用于Android平台的.so库,并记录过程中踩到的坑。 准备知识 将一个C++的工程编译成Android平台可用的.so库,需要用到一些额外的工具。...那么问题来了,cmake依据什么来生成makefile文件呢,很显然,cmake通过CMakeLists.txt文件生成makefile文件。 有图有真相(用个图简单描述下上面几个工具的关系) ?...网上有用taka-no-me的standalone_toolchain,我这里没用过,因为NDK已经提供了。二者有差别,我更倾向于用官方的。...我这里列出详细的环境和版本参数,供大家参考。...文件的名称 -DANDROID_ABI=armeabi-v7a 应用程序二进制接口类型,详见[ABI Management](https://developer.android.com/ndk/guides

    2.5K40

    android Ndk JNI 入门

    怎么配置android studio 中的NDK环境?此时你一定很懵逼,我也是从这过来的,我不能帮助你开发Ndk,但是我可以让你不懵逼。 有需要的可以去百度,这里讲一下android studio。...从上图这个Android系统框架来看,我们上层是通过JNI方式来调用NDK层的,使用这个工具可以很方便的编写和调试JNI的代码。...因为 C语言 不跨平台,在Windows系统下使用NDK编译在 Linux 下能执行的函数库——SO文件,全称Shared Objects,其实质就是一堆c、c++的头文件和实现文件打包成一个库。...4、Gradle Gradle 是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。...三、开发JNI的步骤 JNI代码主要又分为Native代码和Java代码,所以我们得实现Native端和Java端 1、安装NDK配置环境变量和相关插件(NDK、CMake、LLDB) ?

    1.2K21

    Android NDK开发扫盲及最新CMake的编译使用

    本篇文章旨在简介 Android 中 NDK 是什么以及重点讲解最新 Android Studio 编译工具 CMake 的使用 1 NDK 简介 -------- 在介绍 NDK 之前还是首推 Android...官方文档分别从以下几个方面介绍了 NDK NDK 的基础概念 如何编译 NDK 项目 ABI 是什么以及不同 CPU 指令集支持哪些 ABI 如何使用您自己及其他预建的库 本节将会对文档进行总结和补充。...(也是Android现在主推的) 1.2 ABI 是什么 ABI(Application binary interface)应用程序二进制接口。...(库越多,包越大,所以要有选择) 下面我们来看下一共有哪些 ABI 以及对应的指令集 [ABI] ABI 2 CMake 的使用 ----------- 这一节将重点介绍 CMake 的规则和使用,以及如何使用...Android NDK 官网的使用现有库的文档中还是使用 ndk-build + Android.mk + Application.mk 组合的说明文档。

    2.4K30

    【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    来进行显示, 解压出来的数据非常大 1 秒钟几百 M 的数据, 这个过程开销很大 1 分钟 几个 G , 注意优化; ( 7 ) 软解码 : 使用 CPU 实现, 耗电量大, 兼容性强, 性能强(1秒...调用 C/C++ 库; 2.Native 层代码性能很高 : Java 语言的执行效率较低, Native 层的 C 语言代码效率很高, 做高效率的物理运算需要使用 C/C++ 代码实现; 3.NDK...) 应用程序二进制接口 简介 : 1.CPU 指令集 : 程序执行 最终 是转换成 CPU 的指令集来执行, 不同的 CPU 的指令集格式是不同的; 2.ABI ( Application Binary.../configure 命令 进行编译配置; 3.编译 : 使用 make 命令编译, 使用多线程编译 make -j线程数, 如 make -j8, 我的电脑是 四核八线程的, 这里设置 j8 是使用..., 还无法调用, 需要在 CMakeList.txt 中进行一系列的配置才能使用报错; 直接调用动态库的方法会 5.添加动态库 : 使用 下面的 CMake 配置 添加动态库; avcodec 是动态库名称

    3.9K20

    conan入门(十六):profile template功能实现不同平台下profile的统一

    conan: profile template功能实现不同平台下profile的统一 之前我写过的两篇博客《conan入门(十):Windows下Android NDK交叉编译Boost》,....《conan入门(十一):Linux下Android NDK交叉编译Boost》中介绍了在Linux和Windows下NDK交叉编译boost的过程 在这两篇博客中针对Linux和Windows平台我定义了不同的...profile文件,因为Linux和Windows的路径换行符不同,而且Linux和Windows下clang编译器可执行文件的后缀也不同(Windows下为.cmd)。...如果我把这个profile给我的同事,他必须根据平台和NDK安装位置,修改profile才能正常使用。 有没有办法使用不同平台使用同一个profile来实现NDK交叉编译呢?...通过使用.jinja扩展名命名配置文件来启用此功能。当conan加载带有.jinja扩展名的配置文件时,立即解析并渲染模板生成标准的profile。

    71320

    +NDK .so库生成打包

    +NDK开发 This files is not part of the project .so库生成打包 前言 1. 什么是.so库 2. cmake生成.so方案 3....=6.1.1,如图文和网上其他资料不一致,可能是别的资料版本较低而已 前言 涉及到一些算法或者底层驱动的时候,往往需要使用jni来开发。...本篇博文主要是教学两种.so库的打包,稳文中有详细的图文指导,跟着一步步操作就能学会.so文件的打包,对于NDK开发学习请阅读我的《NDK开发系列》文章。...什么是.so库 NDK为了方便使用,提供了一些脚本,使得更容易的编译C/C++代码,这个编译文件为.so文件,它就C/C++库,类似java库.jar文件一样。...2. cmake生成.so方案 使用该种方案生成.so文件,需要先创建一个支持Cmake的 C++ Project,如果不会创建项目请阅读我的博文《Android Studio 4.0.

    1.6K40
    领券