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

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

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

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

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

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

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

持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚
目录 一、实验 1. 环境 2. K8S master节点部署Argo CD 3.基于ArgoCD 实现GitOps (同步部署文件) 4.基于ArgoCD 实现GitOps (同步HELM文件) 二、问题 1. ArgoCD 连接K8S集群状态为 Unknown 2.ArgoCD 创建application失败 …...

SSH无密登陆配置
1 SSH介绍 ssh命令用于远程登录到其他计算机,实现安全的远程管理。 基本语法: ssh 域名/IP地址 示例: (1)从hadoop100服务器上远程连接hadoop101服务器 [hadoophadoop100 ~]$ ssh hadoop101 如果出现如下内容 Ar…...

【bug日记】如何切换jdk版本,如何解决java和javac版本不一致
背景 今天在安装jenkins后,使用java运行war包的时候,提示jdk1.8版本太低,需要提高版本,所以就需要切换jdk版本 解决 在用户变量中,首先更改了JAVA_HOME的地址为17的目录,发现javac的版本改为17了&#x…...
【C语言】6-5 判断回文字符串 分数 20
6-5 判断回文字符串 分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。 函数接口定义: bool palindr…...

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

@vue/cli脚手架
0_vue/cli 脚手架介绍 目标: webpack自己配置环境很麻烦, 下载vue/cli包,用vue命令创建脚手架项目 vue/cli是Vue官方提供的一个全局模块包(得到vue命令), 此包用于创建脚手架项目 脚手架是为了保证各施工过程顺利进行而搭设的工作平 vue/cli的好处 开箱即用 0配置webpack babe…...
在 MyBatis 中<应该怎么写
在 MyBatis 中,< 符号在 XML 配置文件中是一个特殊字符,用于标记 XML 标签的开始。因此,如果你在 MyBatis 的 if 标签中直接使用 < 符号,它会被解析为 XML 标签的开始,从而导致解析错误。 为了避免这个问题&…...
采访亚马逊云科技代闻:深度解读2023re:Invent与生成式AI
2023亚马逊云科技re:Invent已于拉斯维加斯圆满落幕,为进一步解析re:Invent 2023能够对开发者带来哪些深刻影响,亚马逊云科技大中华区解决方案架构部总经理代闻在大会现场接受了InfoQ中国创始人霍太稳的采访,并就re:Invent 2023的前沿洞察与重…...
黑豹程序员-安装docker-ce
docker分为商用版和社区版,我们使用社区版CE 1 安装yum-utils包(提供yum-config-manager 实用程序)并设置阿里镜像库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/cent…...

多臂老虎机算法步骤
内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…...
pgsql的jsonb相关处理及样例
目录 1、某个字段中包含目标list中的全部使用>: 2、某个字段中包含目标list中任意值使用?|: 3、其他操作样例: 1、某个字段中包含目标list中的全部使用>: SELECT * FROM "public"."t_a" WHERE a::j…...

LeetCode-17 电话号码的字母组合
LeetCode-17 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:d…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...