Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 583

使用 Android* NDK 构建面向 x86 的 FreeType 库

$
0
0

简介

 

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” 文件夹,如下所示:

 Create a jni folder

图 1: 创建 jni 文件夹

 

下载 FreeType 库

 

如欲下载最新版 FreeType 中间件,请浏览找到 http://sourceforge.net/projects/freetype/files/freetype2。 截至本文撰写之际,最新 FreeType 版本为 2.6。 切换至 jni 目录,使用 cgwin 或 Linux* 控制台解压 freetype-2.6.tar.gz。

 

 FreeType source files under the jni folder

图 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 按钮。

 Project properties

图 4: 项目属性

 

  • 从配置类型列表中选择 Program。 程序选项支持您定义外部工具位置,以及如何执行脚本。

 Configuration type

图 5: 配置类型

 

  • 名称: 输入新构建程序的名称。
  • 位置: ndk-build.cmd 的位置。
  • 工作目录: 浏览找到工作项目。

 NDK configuration

图 6: NDK 配置

 

构建项目

 

项目成功构建后,面向所有支持架构的 libfreetype.so 文件都放在 /lib<APP_ABI> 下方。 <APP_ABI> 可能是 x86、x86_64、armeabi、arm64-v8a、armeabi-v7a、mips,或者是 omips64,取决于您如何在 Application.mk 中设置 APP_ABI。

 libfreetype.so for x86 devices

图 7:面向 x86 设备的 libfreetype.so

 

总结

 

我们介绍了如何在 Application.mk 中设置 APP_ABI,并使用自动 NDK 构建系统生成面向 x86 设备的 libfreetype.so 的库。

 

参考资料

 

 

关于作者

 

Nancy Le 是英特尔公司软件与服务事业部的一名软件工程师,主要负责英特尔® 凌动™ 处理器扩展支持项目。


Viewing all articles
Browse latest Browse all 583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>