使用 Android NDK 为 x86 设备构建 FreeType 库





0/5 (0投票)
本文档将介绍如何配置 Eclipse 以设置 FreeType 的自动 NDK 构建。
Intel® Developer Zone 提供跨平台应用程序开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员进行创新并取得成功。加入我们的 Android、物联网、Intel® RealSense™ 技术 和 Windows 社区,下载工具、获取开发套件、与志同道合的开发人员分享想法,并参与黑客松、竞赛、路演和本地活动。
FreeType 是一款字体服务中间件,用行业标准的 ANSI C 编写。它自带基于 GNU Make 的构建系统。原生开发工具包 (NDK) 是一个工具集,允许你在 Android 应用程序中实现 C 和 C++,自动生成项目和构建文件,构建原生库,将库复制到适当的文件夹,等等。有关 NDK 的更多信息,请参阅 https://developer.android.com.cn/tools/sdk/ndk/index.html。要下载和安装最新的 NDK 版本,请访问 https://developer.android.com.cn/ndk/downloads/index.html。
构建中间件库有多种方法。你可以使用自动 NDK 构建系统来编译中间件。或者,你可以使用独立工具链选项通过 Cygwin* 进行中间件交叉编译。要获取支持 x86 的 Android* 中间件库列表,请访问 https://software.intel.com/en-us/blogs/2015/06/26/building-android-middleware-libraries-for-x86-devices-using-the-android-ndk。本文档将介绍如何配置 Eclipse* 以设置 FreeType 的自动 NDK 构建。
在 Eclipse 中创建新的 Android* 应用程序项目
有关在 Eclipse* 中创建新 Android 应用程序项目的详细说明,请参阅 https://developer.android.com.cn/tools/projects/projects-eclipse.html。创建新的 Android* 应用程序项目后,在 Android 项目中创建一个名为“jni”的文件夹,如下图所示:
下载 FreeType 库
要下载最新的 FreeType 中间件,请访问 http://sourceforge.net/projects/freetype/files/freetype2。截至本文撰写之时,最新的 FreeType 版本是 2.6。切换到 jni 目录,然后使用 cgwin 或 Linux* 控制台解压 freetype-2.6.tar.gz。
将 Android.mk 和 Application.mk 添加到 Android* 项目中
Android.mk 和 Application.mk 位于 Android* 应用程序项目的 jni 子目录中。Android.mk 是构建系统解析的 GNU makefile。Android.mk 向构建系统指定源文件和共享库。有关 C 和 C++ 源文件链接到 Android* NDK 的 Android.mk 构建文件语法说明,请访问 https://developer.android.com.cn/ndk/guides/android_mk.html。在 jni 子目录中为所有 FreeType 字体创建本地代码 makefile 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)
NDK 构建系统默认生成 armeabi 的机器码。要添加对 Intel® 架构的支持,只需在 jni/Application.mk 中将 x86 添加到 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
设置自动 NDK 构建
第一步是为项目配置 **Builders**,然后选择要为项目启用的 **Builders**。
- 右键单击你的 Android* 项目,然后选择 **properties**。
- 要将新构建器添加到列表中,请在左侧选择 **Builders**,然后单击 **New** 按钮。
- 从配置类型列表中,选择 **Program**。Program 选项允许你定义外部工具的位置以及如何执行脚本。
- Name: 输入新构建器的名称。
- Location: ndk-build.cmd 的位置。
- Working Directory: 浏览到工作项目。
构建项目
项目成功构建后,所有支持架构的 libfreetype.so 文件都将放置在 /lib<APP_ABI> 下。<APP_ABI> 是 x86、x86_64、armeabi、arm64-v8a、armeabi-v7a、mips 或 mips64,具体取决于你在 Application.mk 中的 APP_ABI 设置。
摘要
我们已经介绍了如何在 Application.mk 中设置 APP_ABI,并使用自动 NDK 构建系统为 x86 设备生成 libfreetype.so 库。
参考文献
- FreeType: http://www.freetype.org/freetype2/docs/index.html
- Eclipse* 中的 Android* 应用程序:https://developer.android.com.cn/tools/projects/projects-eclipse.html
- Android* NDK: https://developer.android.com.cn/tools/sdk/ndk/index.html
- Android.mk: https://developer.android.com.cn/ndk/guides/android_mk.html
- Application.mk: https://developer.android.com.cn/ndk/guides/application_mk.html
- 为 x86 设备构建 Android* 中间件库:https://software.intel.com/en-us/blogs/2015/06/26/building-android-middleware-libraries-for-x86-devices-using-the-android-ndk
关于作者
Nancy Le 是 Intel® 公司软件与服务事业部的一名软件工程师,致力于 Intel® Atom™ 处理器规模化赋能项目。