0
点赞
收藏
分享

微信扫一扫

Android 10 根文件系统和编译系统(十):Android.mk编译动态库

 配套系列教学视频链接:

​​Android 10 根文件系统和编译系统-51cto学堂​​


说明

系统:AOSP Android10.0

设备:Android模拟器

前言

本文章重点讲解Android.mk如何控制编译动态库,以及链接该动态库

一, 动态库程序代码

在Anroid层目录新建mytest/lib_test/目录, 并创建文件名:

mytest/lib_test/libmath/my_math.h

#ifndef __MY_MATH_H__
#define __MY_MATH_H__

int my_add(int a, int b);
int my_sub(int a, int b);

#endif

Android 10 根文件系统和编译系统(十):Android.mk编译动态库_AOSP源码编译

mytest/lib_test/libmath/my_math.h

#include "my_math.h"

int my_add(int a, int b)
{
return a+b;
}

int my_sub(int a, int b)
{
return a-b;
}

Android 10 根文件系统和编译系统(十):Android.mk编译动态库_RK3399_02

二, 动态库Android.mk编写

Android源码参考模板: hardware/ril/reference-ril/Android.mk

mytest/lib_test/libmath/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
my_math.c

LOCAL_MODULE:= libmymath

LOCAL_MULTILIB := 64


LOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)


Android 10 根文件系统和编译系统(十):Android.mk编译动态库_Android 源码编译_03

三, 编译动态库


source build/env_setup.sh

lunch  aosp_x86_64-eng

mmm  mytest/lib_test/


生成的目标文件有如下:


中间文件: out/target/product/产品名/obj/SHARED_LIBRARIES/libmymath_intermediates

目标文件:out/target/product/产品名/system/lib64/libmymath.so


此处产品名并没有特别说明是哪一个, 大家未来开发的时候, 产品可以选择不同, 这个产品名就根据自己实际的来定。

四,主程序使用链接库代码

新建文件mytest/lib_test/main/main.c

#include 
#include "my_math.h"

int main(int argc, char *argv[])
{

printf("a + b = %d\n", my_add(30, 40));

return 0;

}

Android 10 根文件系统和编译系统(十):Android.mk编译动态库_Android底层开发_04

mytest/lib_test/main/Android.mk编写如下:


LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
main.c

#指定my_match.h头文件路径
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/../


LOCAL_SHARED_LIBRARIES += \
libmymath


LOCAL_CFLAGS += \
-Wno-error \
-Wno-unused-parameter

LOCAL_MODULE:= math_main_test

LOCAL_MODULE_TAGS := optional


LOCAL_MULTILIB := 64


include $(BUILD_EXECUTABLE)


Android 10 根文件系统和编译系统(十):Android.mk编译动态库_Android底层开发_05

主程序编译:


source build/env_setup.sh

lunch  aosp_x86_64-eng

mmm  mytest/lib_test/main


生成的目标文件有如下:


中间文件: out/target/product/产品名/obj/EXECUTABLES/math_main_test_intermediates/

目标文件:out/target/product/产品名/system/bin/math_main_test


此处产品名并没有特别说明是哪一个, 大家未来开发的时候, 产品可以选择不同, 这个产品名就根据自己实际的来定。

五,运行

启动emulator时需要加参数: -writable-system, 如:


emulator -no-snapshot -verbose -show-kernel -writable-system -cores 4


这样才能使用adb remount, 将system或者vendor重新挂载成可读写分区 , 执行如下命令实现运行:


cd  out/target/product/产品名/

adb  remount 

adb push  system/lib64/libmymath.so  /system/lib64

adb push  system/bin/math_main_test  /system/bin/

adb shell

math_main_test   #执行主程序


 总结

对于程序运行,不一定是要放到虚机的/system/bin目录, 可以放在其他路径, 如/data/目录, 只要权限和分区读写属性允许即可。


举报

相关推荐

0 条评论