当前位置: 首页 > 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…...

构建智能体协作网络:从 MCP 资源连接到 A2A 通信的 Agentic AI 工程实践

1. 智能体协作网络的基础架构 想象一下&#xff0c;你正在指挥一支由不同专家组成的团队完成市场报告。数据分析师负责整理数据&#xff0c;文案专员负责撰写内容&#xff0c;而行政助理则负责最终分发。在AI领域&#xff0c;这样的分工协作正是通过MCP协议和A2A协议实现的。前…...

前端测试:别让你的代码在上线后崩溃

前端测试&#xff1a;别让你的代码在上线后崩溃 毒舌时刻这代码写得跟定时炸弹似的&#xff0c;不知道什么时候就炸了。各位前端同行&#xff0c;咱们今天聊聊前端测试。别告诉我你还在手动测试&#xff0c;那感觉就像在没有安全网的情况下走钢丝——能走&#xff0c;但随时可能…...

从HPA到DepMap:手把手教你用蛋白质和细胞系数据,为你的单基因故事补充关键实验证据

从HPA到DepMap&#xff1a;数据驱动的单基因研究实验设计指南 当你在实验室里凝视着那个刚刚从测序数据中脱颖而出的候选基因时&#xff0c;是否曾为如何设计后续验证实验而犹豫不决&#xff1f;现代生物学研究早已告别了"试错式"的实验盲选时代。本文将带你系统掌握…...

Wireshark网络协议分析技术与实践指南

1. 网络协议分析技术概述1.1 Wireshark工具简介Wireshark&#xff08;前称Ethereal&#xff09;是目前最主流的开源网络协议分析工具&#xff0c;采用WinPCAP接口直接与网卡进行数据报文交换。该工具支持超过2000种网络协议的解析&#xff0c;能够实时捕获和分析网络数据包。1.…...

VisionPro相机控制进阶:用C#实现拍照、实时流与图像保存的完整工作流

VisionPro相机控制进阶&#xff1a;用C#构建工业级图像采集工作流 在工业自动化领域&#xff0c;稳定可靠的图像采集系统是质量检测、尺寸测量和缺陷识别的基础。VisionPro作为工业视觉领域的标杆工具&#xff0c;配合C#强大的开发能力&#xff0c;可以构建出高性能的相机控制…...

Unity Input System手势识别避坑指南:为什么你的双指缩放总是不跟手?

Unity Input System手势识别避坑指南&#xff1a;为什么你的双指缩放总是不跟手&#xff1f; 当你在Unity中实现双指缩放功能时&#xff0c;是否遇到过这样的问题&#xff1a;用户手指明明在屏幕上流畅滑动&#xff0c;但画面却像卡顿了一样&#xff0c;或者缩放比例突然跳变&a…...

别再手动测PLC了!用C# + Modbus Poll/Slave + VSPD三件套,5分钟搞定ModbusRTU通信仿真

工业自动化开发者的效率革命&#xff1a;C#与Modbus仿真工具链实战指南 在工业自动化领域&#xff0c;时间就是金钱。传统PLC调试过程中&#xff0c;工程师常常需要反复连接真实硬件设备&#xff0c;忍受着物理线路故障、设备资源占用和不可复现的测试环境等问题。这种低效的工…...

从手机到充电宝:拆解NTC热敏电阻在消费电子里的那些‘保命’用法

从手机到充电宝&#xff1a;拆解NTC热敏电阻在消费电子里的那些‘保命’用法 当你手握发烫的手机时&#xff0c;是否想过是什么在默默守护着电池的安全&#xff1f;当快充头以惊人速度输送电能时&#xff0c;又是什么在防止电路因过热而损毁&#xff1f;答案往往藏在一块米粒大…...

Java Spring Boot 中构造器循环依赖的处理

本文探讨了 Java Spring Boot 循环依赖问题是由于工程中结构设计不当造成的。通过分析示例代码&#xff0c;解释了循环依赖的原因&#xff0c;并提供了有效的解决方案来避免这些问题&#xff0c;重点是避免在结构中创建依赖对象的新例子&#xff0c;以防止无限递归调用 StackOv…...

NUC 13 Pro装Ubuntu 20.04,WiFi图标消失?别急着换网卡,先试试这个BIOS固件更新法

NUC 13 Pro安装Ubuntu 20.04后WiFi图标消失的终极解决方案 当你满怀期待地在NUC 13 Pro上安装好Ubuntu 20.04&#xff0c;准备开始高效工作时&#xff0c;却发现系统托盘里那个熟悉的WiFi图标神秘消失了——这种挫败感我深有体会。更令人困惑的是&#xff0c;蓝牙功能却完全正…...