Quantcast
Viewing all articles
Browse latest Browse all 3384

Building FreeType Libraries for x86 Devices Using the Android* NDK

Introduction

 

FreeType is a font service middleware that is written in industry-standard ANSI C. It comes with the build system that is based on GNU Make. The native development kit (NDK) is a toolset that allows you to implement C and C++ in Android apps, auto-generate project and build files, build native libraries, copy the libraries into appropriate folders, and more. For more information on the NDK, see http://developer.android.com/tools/sdk/ndk/index.html. To download and install the latest NDK build, go to http://developer.android.com/ndk/downloads/index.html.

There are many ways to build middleware libraries. You can compile middleware using an automatic NDK build system. Alternatively, you can cross-compile middleware from Cygwin* using the standalone toolchain option. For the list of some Android* middleware libraries that support x86, visit https://software.intel.com/en-us/blogs/2015/06/26/building-android-middleware-libraries-for-x86-devices-using-the-android-ndk. In this document, we’ll describe how to configure Eclipse* to set up an automatic NDK build for FreeType.

 

Creating a New Android* Application Project in Eclipse

 

For detailed instruction of how to create a new Android application project in Eclipse*, see http://developer.android.com/tools/projects/projects-eclipse.html. After you have created a new Android* application project, create a “jni” folder inside the Android project as shown below:

Image may be NSFW.
Clik here to view.
 Create a jni folder

Figure 1: Create a jni folder

 

Downloading the FreeType Library

 

To download the latest FreeType middleware, browse to http://sourceforge.net/projects/freetype/files/freetype2. As of this writing, the latest FreeType version is 2.6. Change to the jni directory, and untar the freetype-2.6.tar.gz using a cgwin or Linux* console.

 

Image may be NSFW.
Clik here to view.
 FreeType source files under the jni folder

Figure 2: FreeType source files under the jni folder

 

Adding Android.mk and Application.mk into the Android* Project

 

Android.mk and Application.mk are located in the subdirectory jni of the Android* application project. Android.mk is a GNU makefile that the build system parses. Android.mk specifies source files and shared libraries to the build system. For a description of the syntax of the Android.mk build file for the C and C++ source files to link to the Android* NDK, go to https://developer.android.com/ndk/guides/android_mk.html. Create the native code makefile Android.mk in the subdirectory jni for all FreeType fonts, which looks like this:

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)

Code Sample 1: Android.mk

 

The NDK build system generates machine code for armeabi by default. To add support to the Intel® architecture, simply add x86 to the APP_ABI variable in jni/Application.mk. You can specify multiple architectures on the same line using space delimited.

APP_ABI := armeabi-v7a x86 #can also be x86_64, armeabi, arm64-v8a, mips, mips64

To generate machine code for all supported instruction sets:

APP_ABI := all #can also be all32 or all64

APP_PLATFORM specifies the name of the target Android* platform. Create the simple native modules build file Application.mk in the subdirectory jni as below:

APP_ABI :=all
APP_PLATFORM := android-20

Code Sample 2: Application.mk

 

Image may be NSFW.
Clik here to view.

Figure 3: Setting APP_ABI in Application.mk

 

Setting Up Automatic NDK Builds

 

The first step is to configure the Builders for the project, then select which Builders to enable for the project.

  • Right-click your Android* project, and then choose properties.
  • To add the new builder to the list, select Builders on the left side, and then click the New button.

Image may be NSFW.
Clik here to view.
 Project properties

Figure 4: Project properties

 

  • From the list of configuration types, select Program. The program option allows you to define an external tool location and how to execute the script.

Image may be NSFW.
Clik here to view.
 Configuration type

Figure 5: Configuration type

 

  • Name: Type the name of the new builder.
  • Location: Location of the ndk-build.cmd.
  • Working Directory: Browse to the working project.

Image may be NSFW.
Clik here to view.
 NDK configuration

Figure 6: NDK configuration

 

Building the Project

 

After the project successfully built, all the libfreetype.so files for all the supported architectures are placed under /lib<APP_ABI>. The <APP_ABI> is x86, x86_64, armeabi, arm64-v8a, armeabi-v7a, mips, or mips64, depending how you set it in APP_ABI in Application.mk.

Image may be NSFW.
Clik here to view.
 libfreetype.so for x86 devices

Figure 7: libfreetype.so for x86 devices

 

Summary

 

We have described how to set APP_ABI in Application.mk and generate libfreetype.so libraries for x86 devices using an automatic NDK build system.

 

References

 

 

About the Author

 

Nancy Le is a software engineer at Intel® Corporation in the Software and Services Group working on Intel® Atom™ processor scale-enabling projects.


Viewing all articles
Browse latest Browse all 3384

Trending Articles



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