ハマったポイント2 Android NDK
前回(その1)でNDKのバージョンが最新である事が原因かもしれない疑惑が出てきたので、その線で調べる事にしました。
初めに参考にした、Android Module Development Guide – Documentation & Guides – Appcelerator Wikiの中「Requirements」には、何故かNDKの事について全く触れられていません。
丁寧にPythonやJDKの事まで書いてあるのに・・・もしかしたら、NDKは本来要らない子で、たまたま自分がインストール済みだからそれが邪魔をしているのか・・・?とかいう妄想に駆られ一旦削除してみてビルドを試したり、どうせならクリーンに再インストール、で会社の細い回線でダウンロード待ち時間をロスしたり・・・。
また、Titanium Compatibility Matrixでも、NDKについては触れられていませんので、何を入れたら良いかの情報がありません。
そもそもAndroidモジュールの開発には Android NDK が必須なのか?たったそれだけの事が判りません。
だいぶ後に判った事ですが、正解は別の場所、インストールについての説明に書いてありました。
さらっと。こんなふうに。必須かどうかは微妙な書き方だけど、確かにrequiredと書いています。
The Android NDK is required to build native modules for Android
Android NDKなんて普通にJavaでAndroid書いてる人でも知らない方がいるという位なのに、なんでしょうこの入ってて当たり前でしょ感は。
SDKはともかくJDKでさえ丁寧にいるいる書いてあるのに・・・
情報が錯綜しているので自信は無いですけど、自分がたどり着いた結論としては、「Android NDKは必須」「でも最新のNDK r9ではダメ。少し前の前のr8bで」です。
Vanilla Android Module Build Fails
[#TIMOB-15263] Android: Titanium SDK and Modules will not compile with (latest) Android NDK r9
※2013-12-14追記 SKD3.2.0で解決された様です
※2013-12-25追記 3.2.0GAでr9c試しましたが再現したのでr8bで運用してます
isis re-direct: NDK r8e でTitanium Mobile Android Module がビルドできない
私の場合Macですが、Macに限った話では無くて64bit版OS共通の不具合なのかもしれません。
早速リンクから手繰って、Android NDK r8bをインストールしました。
設定方法はいくつかありますが、モジュールプロジェクト直下のbuild.propertiesに書くか、
android.ndk=/Users/YOUR_NAME/android-ndk-r8b
~/.bash_profile 等で環境変数を書くかです。私はコチラにしましたが、Titanium Studio でantタスクを走らせるには上じゃないとダメっぽいです。
vi ~/.bash_profile
# for Titanium Andorid Module
export ANDROID_SDK=/Users/YOUR_NAME/android-sdk-macosx
export ANDROID_NDK=/Users/YOUR_NAME/android-ndk-r8b
alias titaniumpy=”~/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.3.GA/titanium.py”
これでようやく、ant タスクが SUCCESSSFUL!になるようになりました。
antでエミュレータを起動しようとすると、
ant run.emulator
こんどはこんなエラーが出ます。
run.emulator:
[exec] Traceback (most recent call last):
[exec] File “/Users/YOUR_NAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.2.GA/module/builder.py”, line 255, in
[exec] main(sys.argv)
[exec] File “/Users/YOUR_NAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.2.GA/module/builder.py”, line 188, in main
[exec] manifest = Manifest(os.path.join(project_dir, ‘manifest’))
[exec] File “/Users/YOUR_NAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.2.GA/manifest.py”, line 11, in \__init__
[exec] f = open(data, ‘r’)
[exec] IOError: [Errno 2] No such file or directory: ‘/Users/YOUR_NAME/android-sdk-macosx/manifest’
これについては、titanium.pyのバグの様です。3.1.2も、最新の3.1.3も同様でした。
[#TIMOB-13368] Android emulator cannot be launched using titanium.py – Appcelerator JIRA
titanium.pyを直接編集して回避します。
注意点として、インデントはスペースだとエラーになります。タブじゃ無いとダメです。
vi ~/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.3.GA/titanium.py
#————-
def emulator_args(args, script, project_dir, platform):
if platform == ‘android’:
return [script, ‘run-emulator’, ‘android’, project_dir, get_android_sdk(args)]
#————-
参考にさせて頂いたサイト
勝手/全/超訳 Titanium Mobile Module Developer Guide for Android
Android Module Development Guide – Documentation & Guides – Appcelerator Wiki
Titanium Compatibility Matrix – Titanium 3.X – Appcelerator Docs
Overview (Titanium Android Java API)
TitaniumのAndroid用モジュールを作る その1- しそメモ(Titanium/Android/Ruby)
Issue Navigator – Appcelerator JIRA
Community Questions & Answers – Appcelerator Developer Center