当前位置: 首页 > 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 ################
http://www.lryc.cn/news/265140.html

相关文章:

  • 只更新软件,座椅为何能获得加热功能?——一文读懂OTA
  • EfficientDet:Scalable and Efficient Object Detection中文版 (BiFPN)
  • 视频监控技术经历了哪些发展阶段?视频监控技术未来趋势展望
  • 德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统
  • 类和对象(下篇)
  • 华为鸿蒙(HarmonyOS):连接一切,智慧无限
  • 劈窗算法反演地表温度
  • 持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚
  • SSH无密登陆配置
  • 【bug日记】如何切换jdk版本,如何解决java和javac版本不一致
  • 【C语言】6-5 判断回文字符串 分数 20
  • STL中优先队列(堆)的详解
  • @vue/cli脚手架
  • 在 MyBatis 中<应该怎么写
  • 采访亚马逊云科技代闻:深度解读2023re:Invent与生成式AI
  • 黑豹程序员-安装docker-ce
  • 多臂老虎机算法步骤
  • pgsql的jsonb相关处理及样例
  • LeetCode-17 电话号码的字母组合
  • Ubuntu 22.04 系统创建用户并授权sudo权限
  • Vue2源码梳理:源码构建流程与运行时和编译时的版本选择
  • 透视数据:数据可视化工具的多重场景应用
  • 系列十四(面试)、谈谈你对StackOverflowError的理解?
  • 【WebRTC---源码篇】(二十五)音视频同步
  • 鸿蒙开发之统一样式, @Styles 复用样式
  • 解决java内存问题
  • 分享5款为你生活带来便捷的小工具
  • 【Java JVM】JVM 分析工具
  • 融资项目——vue之双向数据绑定
  • 『番外篇五』SwiftUI 进阶之如何动态获取任意视图的 tag 和 id 值