コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

NDKの複数CPU対応

最近、NDKのリビジョンを上げていなかったのですが、Android NDK, Revision 8 に上げてみました。いつの間にか、arm、mipsx86の3つのCPUに対応したビルドができるようになっていました。
そこで、Luaridaがx86mipsでも動作するように、ネイティブで書いているLuaVM部分を3CPUに対応したビルドが出来るようにしてみました。

Application.mkの設定

ビルドのオプションでもいいのですが、面倒なのでApplication.mkを作成することにしました。中身は下記のみです。

APP_PLATFORM := android-4
APP_ABI := armeabi armeabi-v7a mips x86

LuaridaはVer1.6から対応しているので、プラットフォームはandroid-4にしました。ただし、mipsx86はプラットフォームのミニマムは 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ライブラリも入れたものを配布するようにしたいと思います。ただし、mipsx86版に関しては、動作の保証はございません。