Developer's memo

開発メモ

【Android】【NDK】NDKで作成したCプログラムをデバッグする

 

NDKで作成したCプログラムをgdbデバッグする方法です。

 

デバッグするためにやっておくこと

  1. AndroidManifest.xmlandroid:debuggable="true"を設定
  2. ndk-build NDK_DEBUG=1 でビルドする

デバッグビルドをした場合、最適化が行われないため性能劣化すると言われています。性能試験やリリース時には 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

 

自分は諦めてシミュレータでデバッグしました…。

 

参考書

http://www.amazon.co.jp/Android-NDK%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%87%BA%E6%9D%91-%E6%88%90%E5%92%8C/dp/4798030430

 

【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"は記述しません。

 

 

参考

http://www.noritsuna.com/archives/2009/09/android_ndk.html

【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 すると勝手にできるみたいですね。

 

 

参考サイト

http://www.usefullcode.net/2010/12/android_jni.html