NDKの複数CPU対応
最近、NDKのリビジョンを上げていなかったのですが、Android NDK, Revision 8 に上げてみました。いつの間にか、arm、mips、x86の3つのCPUに対応したビルドができるようになっていました。
そこで、Luaridaがx86やmipsでも動作するように、ネイティブで書いているLuaVM部分を3CPUに対応したビルドが出来るようにしてみました。
Application.mkの設定
ビルドのオプションでもいいのですが、面倒なのでApplication.mkを作成することにしました。中身は下記のみです。
APP_PLATFORM := android-4 APP_ABI := armeabi armeabi-v7a mips x86
LuaridaはVer1.6から対応しているので、プラットフォームはandroid-4にしました。ただし、mipsやx86はプラットフォームのミニマムは 9 なので、android-4を指定しても、自動的にandroid-9でビルドされるようです。
ビルドしてみる
ndk-buildしてみました。
$ ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi-v7a/gdbserver Gdbsetup : libs/armeabi-v7a/gdb.setup Gdbserver : [mipsel-linux-android-4.4.3] libs/mips/gdbserver Gdbsetup : libs/mips/gdb.setup Gdbserver : [x86-4.4.3] libs/x86/gdbserver Gdbsetup : libs/x86/gdb.setup Compile thumb : luavm_module <= main.c Compile thumb : luavm_module <= luavmClient.c ... Compile x86 : luavm_module <= lzio.c Compile x86 : luavm_module <= print.c SharedLibrary : libluavm_module.so Install : libluavm_module.so => libs/x86/libluavm_module.so
途中、warningは出たものの無事ビルドが終了しました。実はerrorが出てヘッダを修正したりしましたが、最終的には全て同じSourceで#ifdefを用いてCPUを切り分けるコードを書くことなくビルドが通るようになりました。ちなみに、もう一度ndk-buildすると、以下のようです。
$ ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi-v7a/gdbserver Gdbsetup : libs/armeabi-v7a/gdb.setup Gdbserver : [mipsel-linux-android-4.4.3] libs/mips/gdbserver Gdbsetup : libs/mips/gdb.setup Gdbserver : [x86-4.4.3] libs/x86/gdbserver Gdbsetup : libs/x86/gdb.setup Install : libluavm_module.so => libs/armeabi/libluavm_module.so Install : libluavm_module.so => libs/armeabi-v7a/libluavm_module.so Install : libluavm_module.so => libs/mips/libluavm_module.so Install : libluavm_module.so => libs/x86/libluavm_module.so
libs以下にそれぞれのCPUのフォルダができてモジュールが保存されるようです。
warningが出た
mipsのビルド中に1つwarningが出たので書いておきます。mipsだけ構造体の中に入れた関数の引数に構造体を使っているとwarningを出しています。
Compile mips : luavm_module <= luavmClient.c In file included from C:/cygwin/home/minao/android-ndk-r8/platforms/android-9/arch-mips/usr/include/signal.h:35, from C:/cygwin/home/minao/android-ndk-r8/platforms/android-9/arch-mips/usr/include/sys/select.h:34, from C:/cygwin/home/minao/android-ndk-r8/platforms/android-9/arch-mips/usr/include/unistd.h:34, from jni/luavmClient.c:12: C:/cygwin/home/minao/android-ndk-r8/platforms/android-9/arch-mips/usr/include/asm/signal.h:105: warning: 'struct siginfo' declared inside parameter list C:/cygwin/home/minao/android-ndk-r8/platforms/android-9/arch-mips/usr/include/asm/signal.h:105: warning: its scope is only this definition or declaration, which is probably not what you want
このwarningを見てもわかるように、mispはandroid-4を指定していても、android-9でビルドしていますね。次のLuaridaからは、これらのndkライブラリも入れたものを配布するようにしたいと思います。ただし、mipsとx86版に関しては、動作の保証はございません。