Macでiconvを使わないlibxmlをNDKでビルドする

2015年7月27日

Android NDK で iconv を含まない libxml を自前でビルドしたときのログです。
検索してもあまり情報が出てこなかったので、まとめておきます。

[環境]
・Mac OS X 10.10.4 Yosemite
・Android NDK r10e
・libxml2-2.9.1

1. ndk-build の設定
libxml2-2.9.1 フォルダ直下に “jni” フォルダを追加します。

2. Android.mk および Application.mk の追加
作成した “jni” フォルダ内に、Android.mk および Application.mk を作成します。
それぞれ、中身は以下のようにしました。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    ../buf.c \
    ../SAX.c \
    ../entities.c \
    ../encoding.c \
    ../error.c \
    ../parserInternals.c \
    ../parser.c \
    ../tree.c \
    ../hash.c \
    ../list.c \
    ../xmlIO.c \
    ../xmlmemory.c \
    ../uri.c \
    ../valid.c \
    ../xlink.c \
    ../HTMLparser.c \
    ../HTMLtree.c \
    ../debugXML.c \
    ../xpath.c \
    ../xpointer.c \
    ../xinclude.c \
    ../nanohttp.c \
    ../nanoftp.c \
    ../DOCBparser.c \
    ../catalog.c \
    ../globals.c \
    ../threads.c \
    ../c14n.c \
    ../xmlstring.c \
    ../xmlregexp.c \
    ../xmlschemas.c \
    ../xmlschemastypes.c \
    ../xmlunicode.c \
    ../xmlreader.c \
    ../relaxng.c \
    ../dict.c \
    ../SAX2.c \
    ../legacy.c \
    ../chvalid.c \
    ../pattern.c \
    ../xmlsave.c \
    ../xmlmodule.c \
    ../xmlwriter.c \
    ../schematron.c\

LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include

LOCAL_MODULE:= libxml
include $(BUILD_STATIC_LIBRARY)
APP_MODULES := libxml
APP_ABI := all

3. libxml のビルド設定
Andrdoid の場合、ビルド設定ファイルを作成します。
libxml2-2.9.1/include/libxml/ にある “xmlversion.h.in” のコピーを作成します。
コピーしたファイルのファイル名を “xmlversion.h” に変更します。

xmlversion.h は、各種機能の設定フラグになっているので、このファイル内の宣言を変更することで libxml の機能を選択できます。
設定を書き込む必要がある箇所は “@” で囲まれた文字列になっています。
ほぼすべて変更しないとビルドエラーになるので、手間ですがひとつずつ修正します。

xmlversion.h は行数が多いので、以下に設定した内容を記載します。
0 で無効, 1 で有効になります。左の数字は xmlversion.h 内での行番号です。
iconv を外したいので、@WITH_ICONV@ の部分を “0” に設定します。
その他は適当、ヘッダとの関連を調べてみましたが、よくわかりません。

行番号 変更箇所 変更後
32 @VERSION@ 2.9.1
39 @LIBXML_VERSION_NUMBER@ 20901
46 @LIBXML_VERSION_NUMBER@ 20901
53 @LIBXML_VERSION_EXTRA@ そのまま
61 @LIBXML_VERSION_NUMBER@ 20901
64 @WITH_TRIO@ 0
93 @WITH_THREADS@ 0
105 @WITH_THREAD_ALLOC@ 0
114 @WITH_TREE@ 1
123 @WITH_OUTPUT@ 1
132 @WITH_PUSH@ 1
141 @WITH_READER@ 1
150 @WITH_PATTERN@ 0
159 @WITH_WRITER@ 1
168 @WITH_SAX1@ 1
177 @WITH_FTP@ 0
186 @WITH_HTTP@ 0
195 @WITH_VALID@ 0
204 @WITH_HTML@ 1
213 @WITH_LEGACY@ 0
222 @WITH_C14N@ 0
231 @WITH_CATALOG@ 0
240 @WITH_DOCB@ 0
249 @WITH_XPATH@ 1
258 @WITH_XPTR@ 1
267 @WITH_XINCLUDE@ 0
276 @WITH_ICONV@ 0
285 @WITH_ICU@ 0
294 @WITH_ISO8859X@ 1
303 @WITH_DEBUG@ 0
312 @WITH_MEM_DEBUG@ 0
321 @WITH_RUN_DEBUG@ 0
330 @WITH_REGEXPS@ 0
339 @WITH_REGEXPS@ 0
348 @WITH_REGEXPS@ 1
357 @WITH_SCHEMAS@ 0
366 @WITH_SCHEMAS@ 0
375 @WITH_SCHEMATRON@ 0
384 @WITH_MODULES@ 1
399 @WITH_ZLIB@ 0
408 @WITH_LZMA@ 0

4. ndk-build
ターミナルで libxml2-2.9.1 直下のディレクトリに移動して、ndk-build を行います。
ファイルは、libxm2-2.9.1/obj/local/ 以下に Application.mk で指定したアーキテクチャごとに出力されます。

おしまい。

スポンサーリンク