ビルド用プロジェクトを作成
Tegra Android Development Pack に含まれる eclipse を用いて、以後の説明を行う。eclipse を起動
eclipse を起動し、任意の場所のワークスペースを開く。プロジェクトを作成
wizard 選択画面で、「C/C++」 ⇒ 「C++ Project」を選択し、「Next」ボタンを押下
Project Name:「ColladaDom」
Use default location:「チェックする」
Project type:「Makefile project ⇒ Empty Project」
Toolchains:「-- Other Toolchain --」
「Finish」ボタンを押下
「ColladaDom」プロジェクトに「jni」ディレクトリを作成
ビルド設定
「ColladaDom」プロジェクトを右クリックして、「Properties」を選択「C/C++ Build」を選択
「Builder Settings」タブ
Use default build command:「チェックを外す」
Build command:「${CYGWIN_HOME}/bin/bash ${NDKROOT}/ndk-build NDK_DEBUG=1 V=1」
Build directory:「${workspace_loc:/ColladaDom/jni}」
「Behaviour」タブ
Build(Incremental build):「”all”文字列を削除」
CPUコアが沢山ある場合は、Use parallel build:Use parallel jobs を設定すると、並列にビルド処理を行うようになる。(Build command の -j オプションが、自動的に追加される)
「OK」ボタンを押下
COLLADA DOM のソースを配置
「ColladaDom」プロジェクトの「jni」ディレクトリ中に、「external-libs」ディレクトリを作成する。
適当なディレクトリに、「collada-dom-2.4.0.tgz」ファイルを解凍する。
「collada-dom-2.4.0\dom\external-libs」ディレクトリの「minizip-1.1」ディレクトリを「ColladaDom」プロジェクトの「external-libs」ディレクトリにコピーする。
「collada-dom-2.4.0\dom」ディレクトリ中の「include」および「src」ディレクトリを、「ColladaDom」プロジェクトの「jni」ディレクトリ以下にコピーする。
ソースのパッチ
「jni/include/dae/daeZAEUncompressHandler.h」ファイル
以下のように修正する。13行目をコメントアウト
#include//#include #include
111行目をコメントアウト
/** * Findselement in manifest.xml. Used by retrieveRootURIFromManifest(). */ // bool findManifestRootElement(xmlTextReaderPtr xmlReader);
「jni/src/dae/daeZAEUncompressHandler.cpp」ファイル
以下のように修正する。74行目から122行目をコメントアウト
125行目から127行目をコメントアウト
131行目から146行目をコメントアウト
//----------------------------------------------------------------- bool daeZAEUncompressHandler::retrieveRootURIFromManifest(const std::string& tmpDir) { // extract via libxml. // bool error = false; // xmlTextReaderPtr xmlReader = xmlReaderForFile( // (tmpDir + MANIFEST_FILE_NAME).c_str(), // NULL, // 0 // ); // // if (xmlReader) // { // if (findManifestRootElement(xmlReader)) // { // if (xmlTextReaderRead(xmlReader)) // { // if (xmlTextReaderNodeType(xmlReader) == XML_READER_TYPE_TEXT) { // const xmlChar* xmlText = xmlTextReaderConstValue(xmlReader); // // // copy xmlText. // std::string rootFilePath((daeString)xmlText); // // // destroy xmlText. // xmlTextReaderRead(xmlReader); // // cdom::trimWhitespaces(rootFilePath); // mRootFilePath = cdom::nativePathToUri(tmpDir + rootFilePath); // } // else // { // error = true; // } // } // else // { // error = true; // } // } // else // { // error = true; // } // } // else // { // error = true; // } // // if (xmlReader) // xmlFreeTextReader(xmlReader); // if (error) // { daeErrorHandler::get()->handleError("Error parsing manifest.xml in daeZAEUncompressHandler::retrieveRootURIFromManifest\n"); return false; // } // // return true; } //----------------------------------------------------------------- //bool daeZAEUncompressHandler::findManifestRootElement( xmlTextReaderPtr xmlReader ) //{ // while(xmlTextReaderNodeType(xmlReader) != XML_READER_TYPE_ELEMENT) // { // if (xmlTextReaderRead(xmlReader) != 1) { // return false; // } // } // // daeString elementName = (daeString)xmlTextReaderConstName(xmlReader); // if (strcmp(elementName, MANIFEST_FILE_ROOT_ELEMENT_NAME.c_str()) == 0) // { // return true; // } // return findManifestRootElement(xmlReader); //}
Makefile を作成
「jni」ディレクトリに「Application.mk」および「Android.mk」ファイルを作成する。LF改行にしておくこと。「Application.mk」ファイル
APP_MODULES := collada_dom collada_LIBXMLPlugin collada_stdErrPlugin collada_STLDatabase APP_ABI := armeabi-v7a APP_PLATFORM := android-9 APP_STL := gnustl_static
「Android.mk」ファイル
LOCAL_PATH := $(call my-dir) DOM_VERSION := 1.4 #DOM_VERSION := 1.5 DOM_VERSION_NO_DOSTS := $(subst .,,$(DOM_VERSION)) COLLADA_DOM_SUPPORT := COLLADA_DOM_SUPPORT141 #COLLADA_DOM_SUPPORT := COLLADA_DOM_SUPPORT150 # # collada_dom # include $(CLEAR_VARS) LOCAL_MODULE := collada_dom LOCAL_ARM_MODE := arm LOCAL_SRC_FILES := $(wildcard src/$(DOM_VERSION)/dom/*.cpp) LOCAL_SRC_FILES += $(wildcard src/dae/*.cpp) LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/external-libs/boost \ $(LOCAL_PATH)/external-libs/minizip-1.1 \ $(LOCAL_PATH)/external-libs/pcre \ $(LOCAL_PATH)/external-libs/tinyxml LOCAL_CPPFLAGS := -DCOLLADA$(DOM_VERSION_NO_DOSTS) LOCAL_CPPFLAGS += -D$(COLLADA_DOM_SUPPORT) LOCAL_CPPFLAGS += -DDOM_INCLUDE_TINYXML LOCAL_CPPFLAGS += -fexceptions LOCAL_STATIC_LIBRARIES := \ boost_filesystem \ boost_system \ minizip \ pcre \ pcrecpp \ tinyxml include $(BUILD_STATIC_LIBRARY) # # LIBXMLPlugin # include $(CLEAR_VARS) LOCAL_MODULE := collada_LIBXMLPlugin LOCAL_ARM_MODE := arm LOCAL_SRC_FILES := src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/external-libs/minizip-1.1 \ $(LOCAL_PATH)/external-libs/tinyxml LOCAL_CPPFLAGS := -DCOLLADA$(DOM_VERSION_NO_DOSTS) LOCAL_CPPFLAGS += -D$(COLLADA_DOM_SUPPORT) LOCAL_CPPFLAGS += -DDOM_INCLUDE_TINYXML LOCAL_CPPFLAGS += -fexceptions include $(BUILD_STATIC_LIBRARY) # # stdErrPlugin # include $(CLEAR_VARS) LOCAL_MODULE := collada_stdErrPlugin LOCAL_ARM_MODE := arm LOCAL_SRC_FILES := src/modules/stdErrPlugin/stdErrPlugin.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_CPPFLAGS := -DCOLLADA$(DOM_VERSION_NO_DOSTS) LOCAL_CPPFLAGS += -D$(COLLADA_DOM_SUPPORT) LOCAL_CPPFLAGS += -DDOM_INCLUDE_TINYXML LOCAL_CPPFLAGS += -fexceptions include $(BUILD_STATIC_LIBRARY) # # STLDatabase # include $(CLEAR_VARS) LOCAL_MODULE := collada_STLDatabase LOCAL_ARM_MODE := arm LOCAL_SRC_FILES := src/modules/STLDatabase/daeSTLDatabase.cpp LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/external-libs/boost LOCAL_CPPFLAGS := -DCOLLADA$(DOM_VERSION_NO_DOSTS) LOCAL_CPPFLAGS += -D$(COLLADA_DOM_SUPPORT) LOCAL_CPPFLAGS += -DDOM_INCLUDE_TINYXML LOCAL_CPPFLAGS += -fexceptions include $(BUILD_STATIC_LIBRARY) # # common libs # $(call import-add-path,external-libs) $(call import-module,boost) $(call import-module,minizip-1.1) $(call import-module,pcre) $(call import-module,tinyxml)
備考
試行錯誤中などに、インポートモジュールだけをビルドしたい場合がある。かといって、「external-libs」のそれぞれの「Android.mk」だけを、実行しようとしても、ndk-build が、親ディレクトリを検索して、おかしな挙動をするので、うまくいかなかった。
仕方が無いので、次の方法でお茶を濁すことにした。
「jni/Application.mk」
APP_MODULES をコメントアウトして
その下の行に以下の行を追加
APP_MODULES := dummy
「jni/Android.mk」
# common libs ブロックの上に、下の設定を追加
include $(CLEAR_VARS) LOCAL_MODULE := dummy LOCAL_STATIC_LIBRARIES := \ boost_filesystem \ boost_system include $(BUILD_STATIC_LIBRARY)
LOCAL_STATIC_LIBRARIES にビルドしたいライブラリ名(boost のモジュール名など)を指定する。