ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2013年06月03日

[Android NDK]複数のsoのAndroid.mkを作るときとか

AndroidのNDK。

Android.mkを使うのはいいけど、複数のAndroid.mkがあるときはどうすればいいか。

libjpegを自前でもったりするパターンで、

jni/jpeg-9
jni/mylib

みたいになってるとき。

これは

jniの直下に Android.mk を作って、

include $(call all-subdir-makefiles)

と書き、
各々のフォルダに Android.mkを置けばいいということらしい。

上の例では

jni/jpeg-9
jni/mylib
の2つにAndroid.mkを書いておくということだ。

ただし、その各々のAndroid.mkの頭に

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

と入れておかないと、直前の Android.mkが汚した変数とかカレントディレクトリが残ってておかしなことになるみたいだ。


あと、さらに加えて、so形式で供給される NDKライブラリがあるときはどうなるか。
普通なら

libs/armeabi
の下に xxxxx.so をただおけばいいのだが、上の Android.mkをやるとここの soファイルをビルドに関係ないものまで消してしまうようだ。

これは

jniフォルダの下にもう1つフォルダを増やし、

jni/external/lib

みたいにし、そこに xxxxx.soを置いて、

jni/externalに

Android.mkを書く。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := xxxxx
LOCAL_SRC_FILES := lib/xxxxx.so
include $(PREBUILT_SHARED_LIBRARY)

よくわからんけど、ようするにただファイルをコピーしろということのようだ。

これで ndk-buildすると xxxxx.soも libs/armeabi下にコピーされるようになる。



最後に、上とは無関係だが、パッケージ名やクラス名に '_'(アンダスコア)が含まれてしまっている場合。

これだと、ndkのexport関数名がおかしなことになってしまう。

com.example_a.*
パッケージの

aaa_bbb

クラスのmyfuncメソッドだとすると、

JNIEXPORT void JNICALL Java_com_example_a_main_aaa_bbb_myfunc

???
これだとセパレータの _ か元からの _ かわからないので実行時みつからないっていうエラー UnsatisfiedLinkError になってしまう。

こういう場合は、 '_'を'_1'でエスケープできる。

つまり、

JNIEXPORT void JNICALL Java_com_example_1a_main_aaa_1bbb_myfunc

これでok。


参考:

[ Android ] 自分でコンパイルした既存のビルド済みの複数の共有ライブラリ(lib***.so)を使う方法。 Android.mk の設定が必要

Android NDKでlibjpegをビルドして利用する

【Android】【NDK】JNIのパッケージ名、クラス名に_(アンダースコア)がある場合
posted by みこあいさ at 18:11| Android開発