<Android开发> 集成so库

<Android开发> 集成so库

<Android开发> HAL层集成第三方so库

一 前言

在笔者的另一个文章<Android开发> HAL层集成第三方so库 分析了如何在hal层将第三方的so库文件集成到系统中;本文其实与其是差不多,只是针对大部分so文件,而且主要分布在system和vendor目录下。

二 移植so文件

移植so目标:

文件名目标集成路径
waterxx.conf/vendor/etc/onefu/config/
vendor/lib/lib64/libxx1.so/vendor/lib64/libxx1.so
vendor/lib/lib/libxx1.so/vendor/lib/libxx1.so
system/lib/lib64/libxx2.so/system/lib64/libxx2.so
system/lib/lib/libxx2.so/system/lib/libxx2.so

新建目录并将相关文件移植到该目录下,结果如下:
在这里插入图片描述

三 新增Android.bp

新增Android.bp,并输入一下内容:

/**
 * Copyright (c) 2023- OneFu
 * All Rights Reserved by OneFu Software Technology Co., Ltd and its affiliates.
 * You may not use, copy, distribute, modify, transmit in any form this file
 * except in compliance with OneFu in writing by applicable law.
 *
 * @file    Android.bp
 * @brief   Android.bp
 * @details Android.bp
 * @version 1.0
 * @author  water
 * @date    2023-06-12
 * <p>
 * Edit History
 * ----------------------------------------------------------------------------
 * DATE                     NAME               DESCRIPTION
 * 2023-06-12               water            Create it.
 */

cc_prebuilt_library_shared {
    name: "libxx1",
    vendor: true,
    multilib: {
		lib32: {
            srcs: ["vendor/lib/lib/libxx1.so"],
        },
        lib64: {
            srcs: ["vendor/lib/lib64/libxx1.so"],
        },
    },
	
    check_elf_files: false,
    compile_multilib: "both"
}
cc_prebuilt_library_shared {
    name: "libxx2",
    multilib: {
		lib32: {
            srcs: ["system/lib/lib/libxx2.so"],
        },
        lib64: {
            srcs: ["system/lib/lib64/libxx2.so"],
        },
    },
	
    check_elf_files: false,
    compile_multilib: "both"
}

cc_prebuilt_library_shared:执行与构建;
name:预构建目标so的文件名;
vendor:表示生成vendor目录下的目标;
multilib:多架构;
lib32:引用32位文件的目标;
lib64:引用64位文件的目标;
srcs:表示引用目标的路径;
check_elf_files:是否检查elf文件;
compile_multilib:编译多架构,这里选择“both”表示32位 和 64位 都要编译。

这样在上述中有“vendor”属性的编译后的目标会放在vendor目录下;未有的,则会放到system目录下。

四 添加编译目标

在device目录下找到一个自己设备使用的product.mk文件,并新增以下内容:

#add product for lib
PRODUCT_PACKAGES += \
    libxx1 \
    libxx2

PRODUCT_COPY_FILES += \
  vendor/onefu/water/waterxx.conf:$(TARGET_COPY_OUT_VENDOR)/vendor/etc/onefu/config/waterxx.conf

五 编译验证

重新编译系统,就可以在对应目录下找到对应的so文件了。

文件名目标集成路径
waterxx.conf/vendor/etc/onefu/config/
vendor/lib/lib64/libxx1.so/vendor/lib64/libxx1.so
vendor/lib/lib/libxx1.so/vendor/lib/libxx1.so
system/lib/lib64/libxx2.so/system/lib64/libxx2.so
system/lib/lib/libxx2.so/system/lib/libxx2.so
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android系统的.so文件和Linux系统的.so文件在一定程度上是相似的,因为Android系统是基于Linux内核进行开发的。.so文件是共享对象文件,也被称为动态链接。它们包含了一组可执行的二进制代码和函数,可以在运行时被程序调用,以实现特定功能。 首先,Android版本的.so和Linux版本的.so具有相同的文件格式,它们都采用了ELF(可执行和可链接格式)文件格式。这意味着它们都具有相似的结构和元数据信息。 其次,它们都具有相同的编译和链接要求。无论是Android版本的.so还是Linux版本的.so,都需要使用相应的编译器和链接器进行处理。例如,在Android开发中,使用的编译工具链包括GCC和Clang等。 然而,尽管在一些方面相似,Android版本的.so和Linux版本的.so也存在一些差异。这是因为Android系统在基于Linux内核的基础上进行了定制和优化。这种定制主要涉及Android运行时环境(ART/Dalvik虚拟机)、Android软件框架和一些其他特定的Android。 由于这些差异,Android版本的.so文件只能在Android系统上运行,而Linux版本的.so文件则可以在各种基于Linux内核的操作系统上运行。 在实际开发中,开发者需要根据目标平台和系统需求选择合适的.so文件。例如,如果开发一个Android应用程序,就需要使用Android版本的.so文件,以确保应用可以正常运行并与Android系统框架进行良好的集成。而如果在普通的Linux系统上开发,就需要使用Linux版本的.so文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waterfxw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值