当前位置: 首页 > news >正文

Andorid 使用bp或者mk编译C文件生成so

在Aosp源码里编译C文件生成so

使用mk编译

文件夹列表

CMkDemo/Android.mk
CMkDemo/cpp/SerialPort.c
CMkDemo/cpp/SerialPort.h

Android.mk 内容如下

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional# All of the source files that we will compile.
LOCAL_SRC_FILES:= \cpp/SerialPort.c# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \libutils liblogLOCAL_HEADER_LIBRARIES += jni_headers# No static libraries.
LOCAL_STATIC_LIBRARIES :=# Also need the JNI headers.
#LOCAL_C_INCLUDES += \
#	$(JNI_H_INCLUDE)# This is the target being built.
LOCAL_MODULE:= lib_cmkdemo
LOCAL_SYSTEM_EXT_MODULE := trueLOCAL_MULTILIB := 64# No special compiler flags.
LOCAL_CFLAGS +=include $(BUILD_SHARED_LIBRARY)

最终生成 ./out/target/product/<device_name>/system/system_ext/lib64/lib_cmkdemo.so

如果去掉 LOCAL_MULTILIB := 64 ,会生成
./out/target/product/<device_name>/system/system_ext/lib/lib_cmkdemo.so
./out/target/product/<device_name>/system/system_ext/lib64/lib_cmkdemo.so

使用bp编译

文件夹列表

CBpDemo/Android.bp
CBpDemo/cpp/SerialPort.c
CBpDemo/cpp/SerialPort.h

Android.bp 内容如下


cc_library_shared {name: "lib_cbpdemo",system_ext_specific: true,compile_multilib: "64",srcs: ["cpp/*.c","cpp/*.cpp",],include_dirs: [],header_libs: ["jni_headers",],shared_libs: ["liblog",]
}
  • 行首空一行,否则编译报错 error: missing separator.
  • cc_library_shared { } :指明编译的是动态so库;
  • name: “lib_cbpdemo” :指明 module 名是 lib_cbpdemo ,最终会生成 lib_cbpdemo.so ;
  • system_ext_specific: true :编译产物在 system_ext 分区,本例对应 ./out/target/product/<device_name>/system/system_ext/lib64/lib_cbpdemo.so ;
  • compile_multilib :指明编译的是 32 还是 64 位的;
  • srcs :源码文件夹或者路径,多个层级可以用类似写法 src/**/*.c ;
  • include_dirs :引用外部的源文件,要写完整路径;
  • header_libs :
  • shared_libs :引用的其他动态 so 库,本例引用的是 liblog.so ;

编译生成的so给其他module引用

场景: 需要把C文件集成到 Test.apk 的源码里,编译生成的 Test.apk 里有对应的 lib_xx.so ,

Android.mk

Test.apk 的 Android.mk ,

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_PACKAGE_NAME := Test
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platformLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_DEX_PREOPT := false
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_PRIVILEGED_MODULE := trueLOCAL_JAVA_LIBRARIES := \xxx-framework \LOCAL_STATIC_JAVA_LIBRARIES += \SettingsLibinclude $(BUILD_PACKAGE)

把 C 文件放到 src/com/test/cpp/ 下,添加 patch 如下,


LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_PACKAGE_NAME := Test
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platformLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_DEX_PREOPT := false
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_PRIVILEGED_MODULE := trueLOCAL_JAVA_LIBRARIES := \xxx-framework \LOCAL_STATIC_JAVA_LIBRARIES += \SettingsLib############### patch begin ################
LOCAL_JNI_SHARED_LIBRARIES:= lib_cmkdemo
############### patch end ################
include $(BUILD_PACKAGE)############### patch begin ################
#LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional# This is the target being built.
LOCAL_MODULE:= lib_cmkdemo
LOCAL_SYSTEM_EXT_MODULE := true# All of the source files that we will compile.
LOCAL_SRC_FILES:= \src/com/test/cpp/SerialPort.c# Also need the JNI headers.
LOCAL_C_INCLUDES += \$(JNI_H_INCLUDE)# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \libutils liblog# No static libraries.
LOCAL_STATIC_LIBRARIES :=#LOCAL_MULTILIB := 64# No special compiler flags.
LOCAL_CFLAGS +=include $(BUILD_SHARED_LIBRARY)
############### patch end ################

Android.bp

Test.apk 的 Android.bp ,

android_app {name: "Test",certificate: "platform",srcs: ["src/**/*.java"],dex_preopt: {enabled: false,},system_ext_specific: true,optimize: {proguard_flags_files: ["proguard.flags"],},platform_apis: true,privileged: true,libs: ["xxx-framework",],static_libs: ["SettingsLib"],
}

把 C 文件放到 src/com/test/cpp/ 下,添加 patch 如下,


android_app {name: "Test",certificate: "platform",srcs: ["src/**/*.java"],dex_preopt: {enabled: false,},system_ext_specific: true,optimize: {proguard_flags_files: ["proguard.flags"],},platform_apis: true,privileged: true,libs: ["xxx-framework",],static_libs: ["SettingsLib"],//############## patch begin ################jni_libs: ["lib_cbpdemo"],
//############## patch end ################
}//############## patch begin ################
//LOCAL_PATH:= $(call my-dir)
cc_library_shared {// This is the target being built.name: "lib_cbpdemo",system_ext_specific: true,// All of the source files that we will compile.srcs: ["src/com/test/cpp/SerialPort.c"],// Also need the JNI headers.include_dirs: JNI_H_INCLUDE,// All of the shared libraries we link against.shared_libs: ["libutils","liblog",],// No static libraries.static_libs: [],//LOCAL_MULTILIB := 64// No special compiler flags.cflags: [],}
//############## patch end ################

相关文章:

Andorid 使用bp或者mk编译C文件生成so

在Aosp源码里编译C文件生成so 使用mk编译 文件夹列表 CMkDemo/Android.mk CMkDemo/cpp/SerialPort.c CMkDemo/cpp/SerialPort.hAndroid.mk 内容如下 LOCAL_PATH: $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE_TAGS : optional# All of the source files that we will…...

只更新软件,座椅为何能获得加热功能?——一文读懂OTA

2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&#xff0c;这则新闻震惊了车圈和所有车主&#xff0c;彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了&#xff0c;车主对各家车企的OTA升级早已见…...

EfficientDet:Scalable and Efficient Object Detection中文版 (BiFPN)

EfficientDet: Scalable and Efficient Object Detection EfficientDet&#xff1a;可扩展和高效的目标检测 摘要 模型效率在计算机视觉中变得越来越重要。本文系统地研究了用于目标检测的神经网络架构设计选择&#xff0c;并提出了几个关键的优化方法来提高效率。首先&…...

视频监控技术经历了哪些发展阶段?视频监控技术未来趋势展望

随着城市经济的发展和进步&#xff0c;视频监控也已经应用在人们衣食住行的方方面面&#xff0c;成为社会主体的一个重要组成部分。随着视频监控的重要性越来越凸显&#xff0c;大家对视频监控技术的发展也非常关注。今天我们来简单阐述一下&#xff0c;视频监控技术经历的几个…...

德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统

设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统 PC端访问地址&#xff1a; www.drhchina.com 一、背景介绍 设计公司通常涉及到大量的创意作品、设计方案、客户资料等重要文件&#xff0c;这些文件往往包含公司的核心价值和商业机密。因此&#xff0c;如何确保…...

类和对象(下篇)

再谈构造函数 构造函数体赋值 在之前的学习中我们知道&#xff0c;在创建一个对象时&#xff0c;我们的编译器就会自动调用构造函数将对象初始化&#xff0c;给对象中各个成员变量一个合适的初始值。 例如&#xff1a; class Date { public:Date(int year, int month, int d…...

华为鸿蒙(HarmonyOS):连接一切,智慧无限

华为鸿蒙是一款全场景、分布式操作系统&#xff0c;旨在构建一个真正统一的硬件生态系统。该操作系统于2019年8月首次发布&#xff0c;并被设计为可以应用于各种设备&#xff0c;包括智能手机、智能手表、智能电视、车载系统等多种智能设备。 推荐一套最新版的鸿蒙4.0开发教程 …...

劈窗算法反演地表温度

目录 摘要操作步骤提取热红外单波段提取NDVI同步像元分辨率与个数劈窗算法地表温度反演制图 摘要 主要使用HJ-2&#xff08;环境减灾二号卫星&#xff09;的IRS传感器的两个热红外波段&#xff0c;以及红波段与近红波段计算得到的NDVI&#xff0c;使用劈窗算法&#xff0c;得到…...

持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚

目录 一、实验 1. 环境 2. K8S master节点部署Argo CD 3.基于ArgoCD 实现GitOps &#xff08;同步部署文件&#xff09; 4.基于ArgoCD 实现GitOps &#xff08;同步HELM文件&#xff09; 二、问题 1. ArgoCD 连接K8S集群状态为 Unknown 2.ArgoCD 创建application失败 …...

SSH无密登陆配置

1 SSH介绍 ssh命令用于远程登录到其他计算机&#xff0c;实现安全的远程管理。 基本语法&#xff1a; ssh 域名/IP地址 示例&#xff1a; &#xff08;1&#xff09;从hadoop100服务器上远程连接hadoop101服务器 [hadoophadoop100 ~]$ ssh hadoop101 如果出现如下内容 Ar…...

【bug日记】如何切换jdk版本,如何解决java和javac版本不一致

背景 今天在安装jenkins后&#xff0c;使用java运行war包的时候&#xff0c;提示jdk1.8版本太低&#xff0c;需要提高版本&#xff0c;所以就需要切换jdk版本 解决 在用户变量中&#xff0c;首先更改了JAVA_HOME的地址为17的目录&#xff0c;发现javac的版本改为17了&#x…...

【C语言】6-5 判断回文字符串 分数 20

6-5 判断回文字符串 分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写函数&#xff0c;判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。 函数接口定义&#xff1a; bool palindr…...

STL中优先队列(堆)的详解

文章目录 priority_queue的基本介绍堆(heap)堆的概念与结构 priority_queue 的介绍与使用 priority_queue的基本介绍 这个priority_queue翻译成中文就是优先级队列&#xff0c;但其实我们很难去一眼看出他的意思到底是什么&#xff0c;他的逻辑结构实际上类似于数据结构中的堆…...

@vue/cli脚手架

0_vue/cli 脚手架介绍 目标: webpack自己配置环境很麻烦, 下载vue/cli包,用vue命令创建脚手架项目 vue/cli是Vue官方提供的一个全局模块包(得到vue命令), 此包用于创建脚手架项目 脚手架是为了保证各施工过程顺利进行而搭设的工作平 vue/cli的好处 开箱即用 0配置webpack babe…...

在 MyBatis 中<应该怎么写

在 MyBatis 中&#xff0c;< 符号在 XML 配置文件中是一个特殊字符&#xff0c;用于标记 XML 标签的开始。因此&#xff0c;如果你在 MyBatis 的 if 标签中直接使用 < 符号&#xff0c;它会被解析为 XML 标签的开始&#xff0c;从而导致解析错误。 为了避免这个问题&…...

采访亚马逊云科技代闻:深度解读2023re:Invent与生成式AI

2023亚马逊云科技re:Invent已于拉斯维加斯圆满落幕&#xff0c;为进一步解析re:Invent 2023能够对开发者带来哪些深刻影响&#xff0c;亚马逊云科技大中华区解决方案架构部总经理代闻在大会现场接受了InfoQ中国创始人霍太稳的采访&#xff0c;并就re:Invent 2023的前沿洞察与重…...

黑豹程序员-安装docker-ce

docker分为商用版和社区版&#xff0c;我们使用社区版CE 1 安装yum-utils包&#xff08;提供yum-config-manager 实用程序&#xff09;并设置阿里镜像库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…...

多臂老虎机算法步骤

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…...

pgsql的jsonb相关处理及样例

目录 1、某个字段中包含目标list中的全部使用>&#xff1a; 2、某个字段中包含目标list中任意值使用?|&#xff1a; 3、其他操作样例&#xff1a; 1、某个字段中包含目标list中的全部使用>&#xff1a; SELECT * FROM "public"."t_a" WHERE a::j…...

LeetCode-17 电话号码的字母组合

LeetCode-17 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;d…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...