博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】Android底层库和程序
阅读量:5291 次
发布时间:2019-06-14

本文共 2519 字,大约阅读时间需要 8 分钟。

原文网址:http://blog.csdn.net/louiswangbing/article/details/6616202

Android底层库和程序

1、     本地实现的基本结构

Android的本地实现层次具有基本的库和程序,这些库和程序是Android基本系统运行的基础,主要包含以下内容:

l  标准C/C++库Bionic;

l  C语言工具库libcutils;

l  init进程;

l  shell工具;

l  C++工具库libutils。

2、     增加本地库的方法

Android中增加本地库或者程序,与其代码路径无关,只和他们的Android.mk文件有关系。

Android.mk和普通的makefile略有不同,具有统一的写法,主要包括一些系统公共的宏定义。

Android.mk中选项参考以下文件路径:

build/core/config.mk

各个选项的默认值在以下文件中定义:

build/core/base_rules.mk

在一个Android.mk中也可以生成多个可执行程序、动态库或者静态库。

在Android中编译一个可执行程序的模板如下所示:

# test exe

LOCAL_PATH :=$(call my-dir)

 

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

               main.c

LOCAL_MODULE :=test_exe

 

#LOCAL_C_INCLUDES:=

#LOCAL_STATIC_LIBRARIES:=

# LOCAL_SHARED_LIBRARIES:=

 

include $(BUILD_EXECUTABLE)

编译一个可执行程序,需要在LOCAL_SRC_FILES中啊计入源文件路径(相当与当前的目录),在LOCAL_C_INCLUDES加入所需要包含的头文件路径,在LOCAL_STATIC_LIBRARIES中加入所需要连接的静态库(.a)的名称,在LOCAL_SHARED_LIBRARIES中加入所需要连接的动态库(.so)的名称。LOCAL_MODULE表示模块最终的名称。最后,使用include $(BUILD_EXECUTABLE)表示以一个可执行程序的方式进行编译。在本例中LOCAL_MODULE被定义为test_exe,因此最终生成的可执行程序的名称是test_exe。

在Android.mk中编译一个静态库的模板如下所示:

# test staticlib

LOCAL_PATH :=$(call my-dir)

 

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

               main.c

LOCAL_MODULE :=libtest_static

      

#LOCAL_C_INCLUDES:=

#LOCAL_STATIC_LIBRARIES:=

# LOCAL_SHARED_LIBRARIES:=

 

include $(BUILD_STATIC_LIBRARY)

编译一个静态库,基本的内容和编译可执行程序相似,区别在于使用include $(BUILD_STATIC_LIBRARY)表示编译静态库,本例中LOCAL_MODULE被定义为libtest_static,所以最终生成的静态库的名称是libtest_static.a。

在Android.mk中编译一个动态库的模板如下所示:

# test sharedlib

LOCAL_PATH :=$(call my-dir)

 

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

               main.c

LOCAL_MODULE :=libtest_shared

      

       TARGET_PRELINK_MODULE:= false

      

#LOCAL_C_INCLUDES:=

#LOCAL_STATIC_LIBRARIES:=

# LOCAL_SHARED_LIBRARIES:=

 

include $(BUILD_SHARED_LIBRARY)

编译一个动态库,基本的内容和编译可执行程序、静态库相似,区别在于使用include $(BUILD_ SHARED _LIBRARY)表示编译静态库,本例中LOCAL_MODULE被定义为libtest_ shared,所以最终生成的静态库的名称是libtest_shared.so。

在Android中不需要对C源文件和C++源文件进行区分,统一加入LOCAL_SRC_FILES中即可。

可执行程序、静态库和动态库生成的编译结果分别在一下的目录中:

out/target/product/generic/obj/EXECUTABLE

out/target/product/generic/obj/STATIC_LIBRARY

out/target/product/generic/obj/SHARED_LIBRARY

每个模块的魔表文件夹分别为:

l  可执行程序:{XXX}_intermediates

l  静态库:{XXX}_static_intermediates

l  动态库:{XXX}_shared_intermediates

其中{XXX}为每个模块中LOCAL_MODULE所定义的名称。

在编译过程中,可以编译目标及的内容,也可以编译主机的内容。以上的例子是编译目标及的内容,可执行程序、动态库、静态库使用宏分别为:

include $(BUILD_EXECUTABLE)

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_STATIC_LIBRARY)

编译主机的内容,可执行程序、动态库、静态库使用宏分别为:

include $(BUILD_HOST_EXECUTABLE)

include $(BUILD_HOST_SHARED_LIBRARY)

include $(BUILD_HOST_STATIC_LIBRARY)

转载于:https://www.cnblogs.com/wi100sh/p/4308444.html

你可能感兴趣的文章
vue购物车的实现
查看>>
Ext.Net- 数据源的绑定ComboBox
查看>>
设计模式(十三)代理模式(Proxy Pattern)
查看>>
ios键盘弹起 body的高度拉长,页面底部空白问题。ios软键盘将页面抵到上面后,关闭软键盘页面不回弹的问题。...
查看>>
[转]Android中OptionMenu的使用
查看>>
[转]Web Service Authentication
查看>>
初识HTML
查看>>
mysql locktables
查看>>
django(一)验证码
查看>>
day06 Java基础
查看>>
do...while和while...do的两种场景比较
查看>>
iOS被开发者遗忘在角落的NSException-其实它很强大
查看>>
WPF学习(1) – XAML
查看>>
集合类接口IEnumerable,IEnumerator,ICollection,IList,IDictionary理解
查看>>
Entity Framework返回IEnumerable还是IQueryable?
查看>>
零基础http代理http完美代理访问
查看>>
数组与内存控制笔记
查看>>
关于 Go2Shell (Go2Shell 可以在 Finder 中打开当前目录的终端窗口,是一个对开发者来说非常有用的App)...
查看>>
2008年我买了一本书 书名叫“PHP 6”
查看>>
管道,数据共享,进程池
查看>>