简介
FreeType 是使用行业标准 ANSI C 编写而成的字体服务中间件。它带有基于 GNU Make 的构建系统。 原生开发套件 (NDK) 这款工具套件可支持您在 Android 应用中实施 C 和 C++、自动生成项目并构建文件、构建原生库、将库拷贝至相应的文件夹等等。 如欲了解更多有关 NDK 的信息,请访问 http://developer.android.com/tools/sdk/ndk/index.html。 如欲下载和安装最新版 NDK build,请前往 http://developer.android.com/ndk/downloads/index.html。
构建中间件库的方法有许多种。 您可以使用自动 NDK 构建系统编译中间件。 还可以使用独立的工具链选项通过 Cygwin* 交叉编译中间件。 如欲获取支持 x86 的 Android* 中间件库列表,请访问 https://software.intel.com/zh-cn/blogs/2015/06/26/building-android-middleware-libraries-for-x86-devices-using-the-android-ndk。 本文将介绍如何配置 Eclipse* 以设置面向 FreeType 的自动 NDK build。
在 Eclipse 中创建新 Android* 应用项目
如欲获取关于如何在 Eclipse* 中创建新 Android 应用项目的详细说明,请访问 http://developer.android.com/tools/projects/projects-eclipse.html。 新 Android* 应用项目创建完成后,在 Android 项目中创建 “jni” 文件夹,如下所示:
图 1: 创建 jni 文件夹
下载 FreeType 库
如欲下载最新版 FreeType 中间件,请浏览找到 http://sourceforge.net/projects/freetype/files/freetype2。 截至本文撰写之际,最新 FreeType 版本为 2.6。 切换至 jni 目录,使用 cgwin 或 Linux* 控制台解压 freetype-2.6.tar.gz。
图 2: jni 文件夹下方的 FreeType 源文件
将 Android.mk 和 Application.mk 添加至 Android* 项目
Android.mk 和 Application.mk 位于 Android* 应用项目的子目录 jni。 Android.mk 是构建系统解析的 GNU makefile。 Android.mk 将源文件和共享库指定给构建系统。 如欲了解面向 C 和 C++ 源文件的 Android.mk 构建文件的语法,以链接至 Android* NDK,请前往 https://developer.android.com/ndk/guides/android_mk.html。 在面向所有 FreeType 字体的子目录 jni 中创建原生代码 Android.mk,如下所示:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) FREETYPE_SRC_PATH := LOCAL_MODULE := freetype LOCAL_CFLAGS := -DANDROID_NDK \ -DFT2_BUILD_LIBRARY=1 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include_all \ $(FREETYPE_SRC_PATH)include \ $(FREETYPE_SRC_PATH)src LOCAL_SRC_FILES := \ $(FREETYPE_SRC_PATH)src/autofit/autofit.c \ $(FREETYPE_SRC_PATH)src/base/basepic.c \ $(FREETYPE_SRC_PATH)src/base/ftapi.c \ $(FREETYPE_SRC_PATH)src/base/ftbase.c \ $(FREETYPE_SRC_PATH)src/base/ftbbox.c \ $(FREETYPE_SRC_PATH)src/base/ftbitmap.c \ $(FREETYPE_SRC_PATH)src/base/ftdbgmem.c \ $(FREETYPE_SRC_PATH)src/base/ftdebug.c \ $(FREETYPE_SRC_PATH)src/base/ftglyph.c \ $(FREETYPE_SRC_PATH)src/base/ftinit.c \ $(FREETYPE_SRC_PATH)src/base/ftpic.c \ $(FREETYPE_SRC_PATH)src/base/ftstroke.c \ $(FREETYPE_SRC_PATH)src/base/ftsynth.c \ $(FREETYPE_SRC_PATH)src/base/ftsystem.c \ $(FREETYPE_SRC_PATH)src/cff/cff.c \ $(FREETYPE_SRC_PATH)src/pshinter/pshinter.c \ $(FREETYPE_SRC_PATH)src/pshinter/pshglob.c \ $(FREETYPE_SRC_PATH)src/pshinter/pshpic.c \ $(FREETYPE_SRC_PATH)src/pshinter/pshrec.c \ $(FREETYPE_SRC_PATH)src/psnames/psnames.c \ $(FREETYPE_SRC_PATH)src/psnames/pspic.c \ $(FREETYPE_SRC_PATH)src/raster/raster.c \ $(FREETYPE_SRC_PATH)src/raster/rastpic.c \ $(FREETYPE_SRC_PATH)src/sfnt/pngshim.c \ $(FREETYPE_SRC_PATH)src/sfnt/sfntpic.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttbdf.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttkern.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttload.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttmtx.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttpost.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttsbit.c \ $(FREETYPE_SRC_PATH)src/sfnt/sfobjs.c \ $(FREETYPE_SRC_PATH)src/sfnt/ttcmap.c \ $(FREETYPE_SRC_PATH)src/sfnt/sfdriver.c \ $(FREETYPE_SRC_PATH)src/smooth/smooth.c \ $(FREETYPE_SRC_PATH)src/smooth/ftspic.c \ $(FREETYPE_SRC_PATH)src/truetype/truetype.c \ $(FREETYPE_SRC_PATH)src/type1/t1driver.c \ $(FREETYPE_SRC_PATH)src/cid/cidgload.c \ $(FREETYPE_SRC_PATH)src/cid/cidload.c \ $(FREETYPE_SRC_PATH)src/cid/cidobjs.c \ $(FREETYPE_SRC_PATH)src/cid/cidparse.c \ $(FREETYPE_SRC_PATH)src/cid/cidriver.c \ $(FREETYPE_SRC_PATH)src/pfr/pfr.c \ $(FREETYPE_SRC_PATH)src/pfr/pfrgload.c \ $(FREETYPE_SRC_PATH)src/pfr/pfrload.c \ $(FREETYPE_SRC_PATH)src/pfr/pfrobjs.c \ $(FREETYPE_SRC_PATH)src/pfr/pfrsbit.c \ $(FREETYPE_SRC_PATH)src/type42/t42objs.c \ $(FREETYPE_SRC_PATH)src/type42/t42parse.c \ $(FREETYPE_SRC_PATH)src/type42/type42.c \ $(FREETYPE_SRC_PATH)src/winfonts/winfnt.c \ $(FREETYPE_SRC_PATH)src/pcf/pcfread.c \ $(FREETYPE_SRC_PATH)src/pcf/pcfutil.c \ $(FREETYPE_SRC_PATH)src/pcf/pcfdrivr.c \ $(FREETYPE_SRC_PATH)src/psaux/afmparse.c \ $(FREETYPE_SRC_PATH)src/psaux/psaux.c \ $(FREETYPE_SRC_PATH)src/psaux/psconv.c \ $(FREETYPE_SRC_PATH)src/psaux/psobjs.c \ $(FREETYPE_SRC_PATH)src/psaux/t1decode.c \ $(FREETYPE_SRC_PATH)src/tools/apinames.c \ $(FREETYPE_SRC_PATH)src/type1/t1afm.c \ $(FREETYPE_SRC_PATH)src/type1/t1gload.c \ $(FREETYPE_SRC_PATH)src/type1/t1load.c \ $(FREETYPE_SRC_PATH)src/type1/t1objs.c \ $(FREETYPE_SRC_PATH)src/type1/t1parse.c\ $(FREETYPE_SRC_PATH)src/bdf/bdfdrivr.c\ $(FREETYPE_SRC_PATH)src/bdf/bdflib.c\ $(FREETYPE_SRC_PATH)src/gzip/ftgzip.c\ $(FREETYPE_SRC_PATH)src/lzw/ftlzw.c \ LOCAL_LDLIBS := -ldl -llog include $(BUILD_SHARED_LIBRARY)
代码示例 1: Android.mk
NDK 构建系统缺省生成面向 armeabi 的机器代码。 如欲为英特尔® 架构添加支持,只需将 x86 添加至 jni/Application.mk 中的 APP_ABI 变量。 您可以使用空格分隔符在同一行指定多个架构。
APP_ABI := armeabi-v7a x86 #can also be x86_64, armeabi, arm64-v8a, mips, mips64
如欲为所有支持的指令集生成机器代码:
APP_ABI := all #can also be all32 or all64
APP_PLATFORM 规定目标 Android* 平台的名称。 在子目录 jni 中创建简单的原生模块构建文件 Application.mk,如下所示:
APP_ABI :=all APP_PLATFORM := android-20
代码示例 2: Application.mk
图 3: 在 Application.mk 中设置 APP_ABI
设置自动 NDK build
第一步是配置面向项目的 Builders,然后选择支持该项目的 Builders。
- 右击 Android* 项目,然后选择 properties。
- 如欲在列表中添加新的构建程序,选择左侧的 Builders,然后单击 New 按钮。
图 4: 项目属性
- 从配置类型列表中选择 Program。 程序选项支持您定义外部工具位置,以及如何执行脚本。
图 5: 配置类型
- 名称: 输入新构建程序的名称。
- 位置: ndk-build.cmd 的位置。
- 工作目录: 浏览找到工作项目。
图 6: NDK 配置
构建项目
项目成功构建后,面向所有支持架构的 libfreetype.so 文件都放在 /lib<APP_ABI> 下方。 <APP_ABI> 可能是 x86、x86_64、armeabi、arm64-v8a、armeabi-v7a、mips,或者是 omips64,取决于您如何在 Application.mk 中设置 APP_ABI。
图 7:面向 x86 设备的 libfreetype.so
总结
我们介绍了如何在 Application.mk 中设置 APP_ABI,并使用自动 NDK 构建系统生成面向 x86 设备的 libfreetype.so 的库。
参考资料
- FreeType: http://www.freetype.org/freetype2/docs/index.html
- Eclipse* 中的 Android* 应用: http://developer.android.com/tools/projects/projects-eclipse.html
- Android* NDK: http://developer.android.com/tools/sdk/ndk/index.html
- Android.mk: https://developer.android.com/ndk/guides/android_mk.html
- Application.mk: https://developer.android.com/ndk/guides/application_mk.html
- 构建面向 x86 设备的 Android* 中间件库: https://software.intel.com/zh-cn/blogs/2015/06/26/building-android-middleware-libraries-for-x86-devices-using-the-android-ndk
关于作者
Nancy Le 是英特尔公司软件与服务事业部的一名软件工程师,主要负责英特尔® 凌动™ 处理器扩展支持项目。