android -- 编译不同库及编译脚本之区别

Android so库的编译 在没弄明白so库编译的关系前,直接看网上博主的博文,常常会觉得云里雾里的,为什么一会儿通过Android工程cmake编译,一会儿又通过NDK命令去编译。两者编译的so库有什么区别?android版第三方库编译总体思路:对于新手小白来说搞明白上面的总体思路图很有必要,因为我一开始发现有些so库可以放在开发工程中拿来直接调用,而有些so库还需要放在开发工程中编译再调用。 阅读详情

我们经常会编译不同库在不同的场合下,而也经常与第三方有合作,对方提供静态库,动态库及配置文件,也有可能需要提供库给对方等等,借此机会将所使用的一些情况作个总结。下面写的android.mk都是一些模板,可能模块可能不需要但加上也无所谓,必要时直接加即可。


1、编译生成动态库

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)


# [optional, user, eng] 
# eng = required
# optinal = no install on target
LOCAL_MODULE_TAGS := eng


# This is the target being built.
LOCAL_MODULE:= libxxx


# Target install path.
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)


# All of the source files that we will compile.
LOCAL_SRC_FILES:= \
xxx.c 
yyy.cpp


# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
liblog \


# No static libraries.
LOCAL_STATIC_LIBRARIES := \


# Also need other headers.
LOCAL_C_INCLUDES += \
    frameworks/base/include/ \


# No specia compiler flags.
LOCAL_CFLAGS += -D_cplusplus


# Don't prelink this library.  For more efficient code, you may want
# to add this library to the prelink map and set this to true.
LOCAL_PRELINK_MODULE := false


include $(BUILD_SHARED_LIBRARY)


2、编译静态库

对上在最后一名:include $(BUILD_SHARED_LIBRARY)

改成:

include $(BUILD_STATIC_LIBRARY)


3、编译生成可执行文件

最后一句修改成 

include $(BUILD_EXECUTABLE)


4、编译生成jar包:

LOCAL_PATH := $(call my-dir)


# the library
# ============================================================
include $(CLEAR_VARS)


LOCAL_MODULE:= libandroidtest
LOCAL_MODULE_TAGS := eng 


LOCAL_SRC_FILES := \
            $(call all-subdir-java-files)


LOCAL_SRC_FILES += \
     $(call all-java-files-under, ../gen)

#LOCAL_SRC_FILES += \
android/net/telecast/INetworkServiceManager.aidl \
### 对于aidl文件不加入到framework/base下的android.mk在线无法编译,可以提前生成aidl的java文件放在gen目录下进行编译

include $(BUILD_JAVA_LIBRARY)


5、只需要拷贝某个文件到目录下而不需要使用其中间编译结果

include $(CLEAR_VARS)


LOCAL_MODULE := libandroidtest.xml
LOCAL_MODULE_TAGS := eng 


LOCAL_MODULE_CLASS := ETC


# This will install the file in /system/etc/permissions
#
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions


LOCAL_SRC_FILES := $(LOCAL_MODULE)


include $(BUILD_PREBUILT)


6、与5条相似,但其它库需要这个中间编译obj,这个对静态库非常重要

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(call add-prebuilt-files, STATIC_LIBRARIES, libchfp.a)

或者写成:

LOCAL_PATH:= $(call my-dir)


#include $(CLEAR_VARS)
#LOCAL_MODULE_TAGS := eng
#$(call add-prebuilt-files, STATIC_LIBRARIES, libchfp.a)


include $(CLEAR_VARS)
LOCAL_SRC_FILES := libchfp.a
LOCAL_BUILT_MODULE_STEM := libchfp.a
LOCAL_MODULE_SUFFIX := lib
LOCAL_MODULE := libchfp
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

ubuntu内使用cmake(clang)交叉编译android so库设置脚本: ANDROID_ABI是CPU架构,ANDROID_NDK是NDK的根目录,CMAKE_TOOLCHAIN_FILE是工具链文件,ANDROID_PLATFORM是支持的最低Android平台。ANDROID_ALLOW_UNDEFINED_SYMBOLS 指定CMake在构建原生库时,如果遇到未定义的引用,是否会引发未定义的符号错误。比如:这是一个编译的脚本------特别注意的是android studio自动生成的cmakelists.txt不用特别管。 阅读详情

相关推荐

android使用Python脚本编译侯建我们所需要的所有的库

使用Python需要注意的一些事项 比如我们想使用modules库下的common.py的类,我们得导入,但是导入的话如果没有__init__文件的话导入不了的,这点得注意 from modules import common __init__.py,为什么必须得使用这个呢 这个跟java有点区别,java中只要是在一个项目中的所有的类都可以通过包名导入,Python,__init__....

江南的博客 2106

Android编译系统介绍

Android编译系统基于GNU make, 也经常采用Python和bash脚本工具。不同于其他基于make的递归型编译系统,Android通过一个脚本搜索所有目录以及子目录,直到发现一个Android.mk文件为止。下图为Android编译系统的结构图(来自Embedded Android).Android编译系统主要包含了两个部分: android/build/ 该文件夹包含了整个编译系统的定

wzn2119的专栏 923

Android 进阶——源码编译之产品配置和常用的Make脚本模板

前面文章总结了MakeFile基础语法和对Android.mk的进行了解读,这篇文章将从整体上概述下AOSP 编译时的产品配置相关知识。Android 的产品配置文件的作用是按照Build系统的要求,将生成产品的各种image文件所需要的对应信息(如版本号等各种参数)、资源(图片、字体、多媒体等)、二进制文件(apk、jar、so库等)有机组织起来,同时根据配置文件进行裁剪或增加模块,所谓系统支持在一定程度上其实就像将相应的资源添加到对应的文件中。默认的编译类型,该编译类型适用于开发阶段,执行即,编译时以下

最美不过,心中有梦,身旁有你! 1600

Android.mk 中的静态库和共享库

浅析如何在Android源码中编译和使用静态库和动态库

阴山隐修者 7269

NDK 是什么 | FFmpeg 5.0 编译 so 库

最后用官网的几句话收尾:Android NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。NDK 将 C 和 C++ 代码编译到原生库中,然后使用 Android Studio 的集成构建系统 Gradle 将原生库打包到 APK 中。其余的东西暂时对我们来说并没有什么太大的意义,现在我们的目的是通过这个源码通过。可以手动设置需要的功能,如果直接别人编译好的,就没有设置的机会。中指定只构建哪些,比较支持的架构越多,应用体积越大。和其他语言,它是一系列工具的集合。

yinshipin007的博客 1817

四参数与七参数坐标转换含义及区别

一.前言 不同坐标系,其椭球体的长半径,短半径和扁率是不同的。比如我们常用的四种坐标系北京54、西安80、WGS84、CGCS2000所对应的椭球体,它们的椭球体参数就各不相同。而不同空间直角坐标系之间的转换一般通过七参数或者四参数来实现坐标转换。 二.四参数转换 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在该模型中有四个未知参数,即: (1)两个坐标平...

尘海折柳的博客 1万+

编译静态库为动态so库

在从事Android开发的过程中,经常会使用到用c或c++编写的第三方的静态库,比如对接第三方时,对方不希望提供源码,又比如在我们的编译环境下,无法编译某个库。这个时候就可以用静态库来编译成动态库so。之前在网络上看过很多方法,似乎都编译失败,因此这里有必要记录一下。 下面以从ffmpeg社区获取到的静态库和头文件的例子,来讲解将静态库编译成动态库so。 编写的Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODUL

k663514387的博客 956

保姆级教程:用Labelme标注车辆关键点,并一键转成YOLOv8-pose训练格式

本文提供了一份详细的车辆底盘关键点标注教程,从使用Labelme进行标注到一键转换为YOLOv8-pose训练格式的全流程指南。特别针对工业检测和自动驾驶场景,分享了标注规范、格式转换脚本及常见问题解决方案,帮助开发者高效准备训练数据并优化模型性能。

weixin_27419879的博客 308

Android Makefile常用模块变量

Android Makefile常用模块变量

特立独行的博客 1385

Linux实战:rMATS可变剪切分析从零到一,避坑指南与结果深度解析

本文详细介绍了在Linux系统上从零开始部署rMATS进行可变剪切分析的完整流程,包括环境搭建、安装避坑指南、参数优化及结果解读。特别针对gfortran依赖、数学库配置等常见问题提供解决方案,并深入解析JC与JCEC结果的差异及可视化技巧,帮助生物信息学研究者高效完成可变剪切分析。

weixin_30394669的博客 409

UG\NX二次开发 判断对象是虚线还是实线

网友提问“怎么区分虚线实线”,这个可以通过函数判断。

王牌飞行员_里海的博客 357

Android.mk构建一个模块

在Android系统开发中,Android.mk是一个非常关键的文件,它用于定义如何构建一个模块,无论是库、可执行文件还是应用程序。这个文件通常位于项目的某个子目录中,为ndk-build或Android的构建系统提供必要的构建指令。

酌沧 1556

C#构建高精度预测模型:从数据预处理到模型部署的实战指南

【代码】C#构建高精度预测模型:从数据预处理到模型部署的实战指南。

墨夶的博客 1263

记录一次Android交叉编译ffmpeg排查错误

Android版本手机直播引擎中,引用了libvlc开源库。项目接过来,发现编译脚本中使用了很多用户名下的绝对路径。项目相关人离职,导致这个脚本实际上已经废掉。而且不知道相关路径下有没有其他文件和第三方库。琢磨很久,基本上搞定了路径问题。还剩下一个ffmpeg开源库编译脚本的选择问题。目录下有十几个文件备用。后来听说是用了一个名为ffmpeg_build.sh的脚本其中有一段 #functi...

weixin_30326515的博客 221

PR工具timing report中setup time的计算过程

然后去pr工具里报告report_delay_calculation/reportDelayCalculation -from related_pin -to constraint_pin。这里constraint pin就是D pin (D0 D1 D2 D3),related pin就是 CK pin。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 455

华为OD机试 - 项目规划 - 深度优先搜索dfs(Java 2024 C卷 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 1153

android系统编译.so库

android系统编译.so库移植准备移植目的移植环境ABI和APIABIAPI编译环境NDK-buildAOSP标题快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表...

优快云mianfeixiazai001的博客 1000

北斗导航 | 基于LSTM-KF融合的北斗卫星定位算法研究框架

针对北斗卫星导航系统在复杂环境下存在的多路径效应、非视距传播等问题,提出一种基于长短期记忆网络(LSTM)与卡尔曼滤波(KF)的组合定位算法。通过LSTM网络建模定位误差的非线性特征,结合卡尔曼滤波实现动态噪声抑制,构建"粗定位-LSTM校正-卡尔曼滤波优化"的三级处理架构。实验表明,融合算法较传统方法定位精度提升42.7%,均方根误差降低至1.2米。

尘世冰封的专栏 920

安卓编译时android.bp和build.gradle的区别

:用途:专为 Android 开源项目(AOSP)设计,用于系统级开发(如 ROM 内置系统应用)。构建系统:基于 Soong(替代 Make 的现代构建系统),与 Ninja 结合生成底层构建规则。环境:仅适用于 AOSP 源码环境,需通过 或 命令编译。:用途:适用于标准 Android 应用开发,通过 Android Studio 管理。构建系统:基于 Gradle(使用 Kotlin 脚本替代 Groovy),支持灵活的构建流程和插件扩展。环境:独立于 AOSP,依赖 Android Gradl

Megumi99的博客 660

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android 编译时:m、mm、mmm、mma、mmma的区别

m:编译整个安卓系统 makes from the top of the tree mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Android.mk文件。 builds all of the moudles in the current directory mma:当前目录新增或删...

qq_35480064的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Termux配置安卓编译环境

Termux安装后,就相当于把手机变成了一台Linux服务器,而且现在手机卡通常是能拿到ipv6公网地址的,所以,这个服务器能干啥?编程搭建网站跑脚本本文讲述的就是怎么在Termux搭建安卓编译环境,实现手机app自产自编,自己搞自己,脱离电脑搞app开发。

Blog for 明月依希 8176

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android学习总结:Android编译过程及脚本的分析

这一期呢主要讲的是Android编译过程及脚本的分析,主要包括三个方面(1).build/envsetup.sh 的分析  (2)lunch做了什么,如何增加或者删除lunch [size=10.5000pt](3)Android编译命令使用 首先呢我们先来看一下Android的编译过程: [size=10.5000pt]1.初始化参数设置 [size=10.5000pt]

寒冰 1516

windows编译ffmpeg+x264库(android和linux)(二)

前言 ffmpeg是一个跨平台的音视频处理库,为了跨平台那么就需要编译出适用于各个平台的ffmpeg库。一般在windows平台下会进行windows开发和安卓开发,所以本文的目的就是在windows平台下编译用于windows和安卓使用的ffmpeg库 在windows平台下编译ffmpeg有多种方式: 1、windows下装linux虚拟机编译用于Linux,Android平台使用的库 2、windows下通过Cygwin或minGW+MSYS编译用于windows,Android平台的库 这里采

翻肚鱼儿的博客 805

基于Android平台的ffmpeg编译

前面介绍了Android jni 相关知识,但jni最终还是要调用的第三方的C/C++库,这里我们以ffmpeg为例,介绍第三方C/C++如何编译成android 版本。 一、基本原理 关于Android平台C/C++代码编译的方法: 自己开发的C/C++代码,直接在android studio开发和编译,与jni代码操作方法一致,jni本质就是C/C++代码,只不过调用关于jni的特殊函数,遵守JNI的某些规范而已。 第三代码。对应第三方代码,直接拷贝到 android studio 开发...

江海细流的专栏 2571

Rust库交叉编译以及在Android与iOS中使用

本篇是关于交叉编译Rust库,生成Android和iOS的二进制文件(so与a文件),以及简单的集成使用。

唯鹿的博客 7016
上一篇: android -- 系统应用替换玩法
下一篇: 如何根据meta-data内容杀指定应用
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值