【Android】【NDK】NDKで作成したCプログラムをデバッグする
NDKで作成したCプログラムをgdbでデバッグする方法です。
■デバッグするためにやっておくこと
※デバッグビルドをした場合、最適化が行われないため性能劣化すると言われています。性能試験やリリース時には NDK_DEBUG=1 をはずしましょう。
以上を行った上で.apkファイルを実機orシミュレータにインストールしておきます。
■いざデバッグ
初期化処理などでCプログラムを利用している箇所のデバッグをしたい場合は
JAVA側でCの処理を呼び出す前にブレークポイントを張って処理止める必要があります。
通常のJAVA側のデバッグ方法でブレークポイントまできたら、ターミナルで以下の
コマンドを実行します。
$ ndk-gdb
成功すれば、(gdb) とでて対話式の画面になるはずですので、Cの部分のデバッグはこれで行えます。
※gdbの使い方に関してはここでは説明しません。
なお実機でデバッグ時に ndk-gdb を実行すると以下のエラーが出る場合があります。
$ ndk-gdb ERROR: Could not extract package's data directory. Are you sure that your installed application is debuggable?
どうやら実機にアプリが多くインストールされていると起きるバグのようです。
以下のサイトに解説があります。
http://blog.kmckk.com/archives/3960006.html
自分は諦めてシミュレータでデバッグしました…。
参考書
【Android】【NDK】複数の静的ライブラリを結合する
複数の静的ライブラリ(.a)を一つのモジュールにする場合、Android.mk には
以下のように記述する。
生成するモジュール: aaa.so
結合する静的ライブラリ: libbbb.a libccc.a
LOCAL_MODULE := aaa LOCAL_SRC_FILES := aaa.cpp LOCAL_LDLIBS := -L[ライブラリの配置場所] -lbbb -lccc LOCAL_STATIC_LIBRARIES := bbb ccc include $(BUILD_SHARED_LIBRARY)
LOCAL_LDLIBS とLOCAL_STATIC_LIBRARIES に記述すればよいみたいですね。
ちなみにライブラリの先頭の"lib"と末尾の".a"は記述しません。
参考
【Android】【NDK】ndk-buildで静的ライブラリを作る
ndk-buildで静的ライブラリを作るにはmakeファイルを
変更する必要がある。
①Android.mk
hello-jni などで
include $(BUILD_SHARED_LIBRARY)
となっている箇所を
include $(BUILD_STATIC_LIBRARY)
にする。
②Application.mk
Android.mkと同じディレクトリに作成する。
中には
APP_MODULES := module名
を書く
参考
http://www.ekesete.net/log/?p=1922
【Android】【NDK】NDKがjava.lang.UnsatisfiedLinkErrorで動かない
サンプルの hello-jni から卒業して、自作のNDKを動かそうとしたところ、
アプリが強制終了してしまった。ddmsには以下のエラー文が。
java.lang.UnsatisfiedLinkError:[JNIメソッド名]
エラー内容を調べてみると、
「loadLibraryの呼び出し忘れか、指定されたDLLまたはSOファイルが見つからないか、呼び出したいnative関数がDLLやSO内に見つからないか。」
loadLibraryは呼んでいるし、.so はたしかにある・・・。
メソッド名は規約に従ったつもり・・・・と思ってたらクラス名抜けてる!!
メソッド名規約
"Java_パッケージ名_クラス名_メソッド名"
直したら無事動きました。
思い込みは怖い…よく確認しないとダメですね。
参考
http://www.ne.jp/asahi/hishidama/home/tech/java/exception.html
【Android】【NDK】1からJNIプロジェクト作成する方法
NDKのサンプルプロジェクトを直接インポートして実行する方法は
わかりましたが、実際自分のアプリをNDKを使って作りたい場合に
最初どういう手順が必要なのか疑問だったので調べました。
以下手順。
※Eclipseは日本語済みの解説
①通常通りにAndroidプロジェクトを作る。
②[新規]→[フォルダー] 作成したプロジェクトを選択して、
フォルダー名は「jni」にする。
③作成したフォルダー内に Cソースと Android.mk を作成。
※Android.mk は固定名なので変更不可。大文字小文字も注意。
以上
…なんてことはなく、通常のAndroidプロジェクトにjniをフォルダを作って
makeファイルとCソースを突っ込めばよかっただけでした。
.so ができあがる libs フォルダや obj なんかは ndk-build すると勝手にできるみたいですね。
参考サイト