ndk的系统构建

1构建多个共享库

为了建立可供住应用程序使用的模块,必须将该模块变为共享库。Android ndk构建系统将BUILD_SHARE_LIBRARY变量设置成 build-shared-library.mk文件位置。该makefile片段包含了将源文件构建和组装成共享库的必要过程:

include $(BUILD_SHARE_LIBRARY )

上一篇中,就是一个简单的模块;然而,除非模块需要特殊处理,否则Android.mk文档将包含一模一样的流程和指令。

2构建多个共享库

基于不同的应用程序的体系结构,一个单独的Android.mk文档可能产生多个共享库模块。为了达到这个目的,需要如下程序清单Android.mk文档中定义多个模块。

LOCAL_PATH := $(call my-dir)

#

#模块1

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni.c

LOCAL_MODULE    := NativeLib

include $(BUILD_SHARED_LIBRARY)

#

# 模块2

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni2.c

LOCAL_MODULE    := NativeLib2

include $(BUILD_SHARED_LIBRARY)

重新编译构建文档之后,Android NDK构建系统会产生两个定义的共享库

3构建静态库

Android NDK构建系统也支持静态库。实际的Android应用程序并不直接使用静态库,并且应用程序包中也不包含静态库。静态库可以用来构建共享库。例如,在将第三方代码添加到现有的原生项目中,不用直接将第三方源代码包括在原生项目中,而是将第三方代码编译成静态库然后并入共享库,如下面程序。

LOCAL_PATH := $(call my-dir)

#

# 第三方库

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/staticlib.c

LOCAL_MODULE    := StaticLib

include $(BUILD_STATIC_LIBRARY)

#

# 目标库

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni.c

LOCAL_MODULE    := NativeLib

LOCAL_STATIC_LIBRARIES := StaticLib

include $(BUILD_SHARED_LIBRARY)

将第三方代码模块生成模块静态库之后,共享库就可以通过将它的模块名称添加到LOCAL_STATIC_LIBRARIES变量中来使用该模块

4,用共享库共享通用模块

静态库可以保证源代码模块化;但是当静态库与共享库相连接时,他就变成了共同共享库的一部分。在多个共享库的情况下,多个共享库与同一个静态库连接时,需要将通用模块的多个副本与不同共享库重复相连,这样就增加了应用程序的大小,在这种情况下,不同构建静态库,而是将通用模块作为共享库建立起来,而动态库连接依赖模块以便消除重复的副本。

LOCAL_PATH := $(call my-dir)

#

# 第三方库

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/staticlib.c

LOCAL_MODULE    := StaticLib

include $(BUILD_SHARED_LIBRARY)

#

# 目标库

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni.c

LOCAL_MODULE    := NativeLib

LOCAL_SHARED_LIBRARIES := StaticLib

include $(BUILD_SHARED_LIBRARY)

#

# 目标库

#

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni2.c

LOCAL_MODULE    := NativeLib2

LOCAL_SHARED_LIBRARIES := StaticLib

include $(BUILD_SHARED_LIBRARY)

5.在多个ndk项目间共享模块

同时使用静态库和共享库时,可以在模块间共享通用模块,但要说明的所有的模块必须数据属于同一个NDk项目,从R5开始,android NDK 也允许在NDK项目间共享和重建模块。考虑前面讲过的实例,可以通过以下步骤在过多个ndk项目间共享。

作为共享模块,需要自己的Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include  \

$(LOCAL_PATH)/src

LOCAL_SRC_FILES := src/hello-jni.c

LOCAL_MODULE    := NativeLib

#LOCAL_SHARED_LIBRARIES :=StaticLib

include $(BUILD_SHARED_LIBRARY)

$(call import-module,test/StaticLib)

将原先模块移动到项目外面,将import-modules函数宏调用放在Android.mk文档的尾部。

import-modules 函数需要先定位共享模块,然后再将它导入到NDK项目中,默认情况下,,import-modules函数宏值搜索<Android NDK>/source 目录中,为了搜索 共享模块目录,顶一个名为NDK_MODULE_PATH的新的环境变量并将它设置为共享模块的根目录,

6 用prebuild库

使用共享模块要求有共享模块的源代码,Android NDK构建系统简单的把这些资源文件包含在NDK项目中并每次构建它们,Android NDK也提供对Prebuild库的支持。在下面的情况,Prebuild库是非常有用的

  • 想在不发布源代码的情况下将模块发布给别人
  • 想使用共享模块的预建版来加速构建过程。

尽管已经被编译了,但预建模块仍需要一个Android.mk构建文档,如下面编译ffmpeg

LOCAL_PATH := $(call my-dir)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := avcodec

LOCAL_SRC_FILES := libavcodec.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := avfilter

LOCAL_SRC_FILES := libavfilter.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := avformat

LOCAL_SRC_FILES := libavformat.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := avutil

LOCAL_SRC_FILES := libavutil.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := postproc

LOCAL_SRC_FILES := libpostproc.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := swresample

LOCAL_SRC_FILES := libswresample.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := swscale

LOCAL_SRC_FILES := libswscale.a

include $(PREBUILT_STATIC_LIBRARY)

# prepare libX

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

LOCAL_MODULE    := x264

LOCAL_SRC_FILES := libx264.a

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

TARGET_ARCH_ABI := armeabi-v7a

LOCAL_MODULE     := live_jni

LOCAL_SRC_FILES  := live_jni.c

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

LOCAL_CFLAGS     := -D__STDC_CONSTANT_MACROS -Wno-sign-compare -Wno-switch -Wno-pointer-sign -DHAVE_NEON=1 -mfpu=neon -mfloat-abi=softfp -fPIC -DANDROID

LOCAL_STATIC_LIBRARIES := avfilter avformat avcodec postproc swresample swscale avutil x264

LOCAL_LDLIBS     := -L$(NDK_ROOT)/platforms/$(APP_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -llog -ljnigraphics -lz -ldl

include $(BUILD_SHARED_LIBRARY)

LOCAL_SRC_FILES 变量指向的不是源文件,而是实际prebuilt库相对于LOCAL_PATH的位置。

prebuilt库定义中不包含任何关于该库所构建的实际机器体系结构的信息。开发人员需要确保prebuilt库是为与NDK项目相同的及其体系结构而构建的。

PREBUILT_STATIC_LIBRARY 变量指向prebuilt-shared-library.mk makefile片段。它什么都没构建,只是将prebuilt库复制到NDK项目的libs目录下。通过使PREBUILT_STATIC_LIBRARY 变量,静态库可以像共享库一样被用作PreBuil库,NDK项目可以像普通共享库一样使用PreBuilt库了

时间: 2024-10-11 17:32:03

ndk的系统构建的相关文章

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(35)-文章发布系统②-构建项目

注:阅读本文,需要阅读本系列的之前文章 代码生成器下载地址(文章开头处) 接下来我们建立数据库的表和各层的代码 我们只需要两张表,文章列表(MIS_Article)和类别表(MIS_Article_Category) USE [AppDB] GO /****** Object: Table [dbo].[MIS_Article] Script Date: 05/15/2014 17:33:15 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER

机器学习系统构建

看了NG视频关于机器学习系统构建的建议,感觉很实用,记录下来作为听课笔记. 首先是机器学习系统构建的流程: NG推荐方法:首先快速实现一个可能并不是很完美的算法系统,进行交叉验证,画出学习曲线去学习算法问题之处,是high bias or high variance 细节看这篇博文介绍:bias和variance在机器学习中应用 最重要一步:错误分析,手工检验算法错误学习的样本,找到算法在什么类型例子上犯错误!然后几种经历在处理这类错误上. 下面以垃圾邮件系统举例: 反垃圾邮件系统发现误分类最多

linux系统构建基础学习笔记——操作

linux系统构建 ********************************************************                  ---交叉编译环境构建--- 安装arm-linux-gcc-4.3.2 (交叉编译器) tar xzvf arm-linux-gcc-4.3.2.tgz -C /cd /usr/local/arm/4.3.2/bin./arm-linux-gcc -v在/etc/bashrc文件的最后添加如下一行:   export PATH=

linux系统构建学习笔记

嵌入式系统构架:(硬件+软件)应用软件层: Application GNU C Library(glibc)文件系统: 系统层: API(Systern Call Interface) OS Core + Power Mannager+ File Manager + GUI Mannager TCP/IP HTTP WAP DataBase Browser DDI(Device Drver Interface) 板级支持:BSP:Board Support Package       OEM A

基于Salt Event系统构建Master端returner

前置阅读 环境说明 开工 前置配置 编写returner 测试 SaltStack 的 returner 是由minion端主动连接returner完成执行结果的存储, 在部分场景下并不能满足需求. 由于Salt底层已经构建了一套 Event系统, 所有的操作均会产生event. 因此基于Salt Event系统构建Master端returner成为一种可能. 之前已经完成了 SaltStack Event系统监听events测试, 本文将基于Salt Event系统构建Master端retur

用FineReport报表系统构建ITIL流程系统变更分析

用FineReport报表系统构建ITIL流程系统变更分析 注:此文为"帆软十年,项册征集"活动的获奖作品. 一.应用背景 随着ITIL的发展和深入,为提高IT服务管理的质量,某银行上线一套符合ITIL的流程工具,其中涉及事件.问题.测试.变更管理等流程,上线后,有效地控制了运营管理中各流程环节的质量,提高了整体效率,为收集和展现电子流程化管理效果,量化考核指标,需提高报表展现效果和报表效率,以前的报表软件对excl支持不够,且图形不能导出,而这正是FineReport报表工具的优势.

shell项目-分发系统-构建文件分发系统

shell项目-分发系统-构建文件分发系统 需求背景对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台.所以,自动同步文件是至关重要的. 实现思路首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可. 核心命令rsync -av --files-from=list.txt / [email protected]:/ 文件分发系统的实现 1.rsync.expect 内容 #!/u

用命令行对NDK项目进行构建(Win7环境下,以hello-jni项目为例)

尽管Eclipse可以很好地简化整个构建和部署过程,但Eclipse不是构建Android NDK项目的必要条件,整个过程也可以用命令行方式执行. 用原生组件构建Android项目需要两步:第一步构建原生组件,第二步构建Java应用程序并将Java应用程序与其原生组件打包. 第一步:构建原生组件. (1)打开命令提示符,将hello-jni project所在目录更改为当前目录. (2)在命令行下执行 ndk-build(ndk-build是一个调用Android构建系统的辅助脚本).这时And

熊猫直播Rancho发布系统构建之路(二)

前段时间写了一篇关于熊猫直播Rancho发布构建之路文章,里面涵盖了发布平台的全部功能,也列举了技术架构,当前使用和支撑情况,包括产品开发的目的,设计等等. 接下来的时间里,我们又在发布平台上开发了新功能,而且前期在排期,而时间有限无法抽身做的功能,现于开发完成,并且上线使用了2周时间,很稳定: 1)权限体系升级:在第一版发布系统,我们只是针对整体项目组,项目,来做权限控制. 举个例子: 小明是新来的开发人员或者是实习生,刚开始线上的发布权限肯定要谨慎点开通,发布系统只授权beta,demo等开