Android 10 根文件系统和编译系统(十):编译动态库
配套系列教学视频链接:
Android 10.0 AOSP源码编译:
https://www.100ask.net/detail/p_60a1e037e4b0adb2d864c6d8/6
Android 10.0 根文件系统和编译系统:
https://www.100ask.net/detail/p_60ab34b7e4b00176519e388c/6
说明
系统: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
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.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)
三, 编译动态库
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 <stdio.h>
#include "my_math.h"
int main(int argc, char *argv[])
{
printf("a + b = %d\n", my_add(30, 40));
return 0;
}
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)
主程序编译:
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/目录, 只要权限和分区读写属性允许即可。