NDKを使用してAndroid x86用のFreeTypeライブラリを構築する

FreeTypeは、無料の低レベルフォントライブラリです。 ANSI Cで書かれており、非常に多くの有名なプロジェクトで使用されています。 たとえば、Androidの場合。 ただし、Androidアプリケーションアプリケーションは、このライブラリに直接アクセスできません。 したがって、独自のプロジェクトで使用する場合は、関心のあるプラットフォーム用にFreeTypeをアセンブルする必要があります。 NDKツールを使用して、x86プラットフォーム向けに構築します。







NDKには、Android用のライブラリの構築に加えて、他の便利な機能があります。 たとえば、CおよびC ++でモバイルアプリケーションを作成するために使用できます。また、ビルドファイルの自動作成やプロジェクト構造の操作など、多くのユーティリティ機能もサポートしています。



Android用のライブラリを作成するには、多くの方法があります。 たとえば、NDK自動ビルドシステムを使用します。 もう1つのオプションは、Cygwinのクロスコンパイルツールと別のNDKツールセットです。



ここでは、x86プラットフォームをサポートするAndroidのライブラリのリストを見つけることができます。 この記事では、 Eclipse IDEを使用して、FreeTypeライブラリの自動NDKアセンブリを編成する方法を説明します。



プロジェクトのセットアップとライブラリの構築



Eclipseで新しいAndroidアプリケーションプロジェクトを作成し、jniフォルダーを追加します。









新しいAndroidアプリプロジェクトのJniフォルダー



次に、 FreeTypeライブラリのコードを含むアーカイブをダウンロードします。 私たちの場合、これはバージョン2.6です。 アーカイブをjniフォルダーに解凍します。









jniフォルダーのFreeTypeソースコード



次に、Android.mkファイルとApplication.mkファイルをアプリケーションプロジェクトに追加します。 これらのファイルはjniフォルダーに配置する必要があります。 Adroid.mkは、ビルドシステムが処理するGNU makefileです。 このファイルには、アプリケーションのソースコードを含むファイルに関する情報と、プロジェクトのビルドに必要な外部ライブラリに関する情報が含まれています。



ここでは、Android.mkの構文と、CおよびC ++で記述されたAndroidアプリケーションのアセンブリの機能に関する詳細を見つけることができます。 このファイルをjniフォルダーに作成します。これは、サポートされているすべてのフォント形式でFreeTypeライブラリを構築するように設計されています。



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ファイルを構成する必要があります。 つまり、変数APP_ABIに「x86」を追加します。 組み立ては複数のプラットフォームで同時に実行でき、それらの識別子はスペースで示されます。



2つのターゲットアーキテクチャ用に構成されたAPP_ABI変数は次のとおりです。



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





利用可能なすべての命令セットのマシンコードを生成するには、次の設定を使用できます。



 APP_ABI := all #    all32  all64
      
      





変数APP_PLATFORMには、ターゲットAndroidプラットフォームの名前が含まれています。 Application.mkは非常にシンプルであることがわかりました。



 APP_ABI :=all APP_PLATFORM := android-20
      
      





コードエディタでは次のようになります。









Application.mkファイルでのAPP_ABIの構成



準備が完了しました。NDKを使用してプロジェクトの自動アセンブリを構成します。 これを行うには、まずプロジェクトのビルダーのリストを構成し、次にライブラリを準備するときに使用する必要がある特定のコレクターを選択します。



これを行うには、Androidプロジェクトを右クリックして、メニューから[プロパティ]を選択します。 リストに新しいビルドシステムを追加するには、表示されるウィンドウの左側の[ビルダー]タブに移動し、右側の[新規]ボタンをクリックする必要があります。









プロジェクトのプロパティ



構成タイプ選択ウィンドウのリストから、「プログラム」を選択します。 このオプションを使用すると、外部ツールの場所と、アセンブリを実行するスクリプトの実行方法を正確に指定できます。









構成設定



表示されるウィンドウで、次のフィールドを構成します。











NDKを構成する



上記の設定が完了したら、プロジェクトのアセンブリを実行します。 このプロセスが成功すると、/ lib / <APP_ABI>スキームに従って名前が作成されたフォルダーで、Application.mkで指定されたプラットフォームのライブラリアセンブリを見つけることができます。 特に、x86およびx86_64フォルダーに関心があります。









x86ベースのAndroidデバイス用のLibfreetype.soファイル



まとめ



FreeTypeライブラリがコンパイルされ、独自のAndroidアプリケーションで使用できるようになりました。



All Articles