ndk-buildの防備録
mipsやx86版のAndroidでも動作するように、Luaridaのネイティブの部分をビルドしなおしたのだけれど、今まで気づいてなかったバグがあってx86版がうまく動作しませんでした。防備録としてブログに残しておきます。
現在のNDK(android-ndk-r8)は下記のようにApplication.mkに書いておけば、ndk-buildで自動的にビルドしてくれます。
APP_ABI := armeabi mips x86 armeabi-v7a
このようにして無事ビルドできたのですが、x86エミュレータで動作させたときに落ちてしまいます。どこかCプログラムがおかしいのだろうなぁと、探していくと、見つけました。「バグ退散」
下記のようなコードを書いていました。
int lenok = send( SocketNumber, SendData, SendData[1], 0 );
これのどこがだめかと言うと、SendDaraはchar配列で定義していて、配列の2バイト目(SendData[1])には配列のデータ長を入れているのです。charで定義しているので、当然128を超えるとマイナスになるはずです。これは思いっきりバグなのですが、ARMのコンパイラ(sendのマクロかもしれませんが)では、正しくintにキャストしてくれていたようで、問題なく動いていました。
ところが、x86のコンパイラは正直にマイナスを入れるので、何も送信されず、バグが露呈することになりました。
ちゃんとunsigned charにキャストすると正しく動作するようになりました。
int lenok = send( SocketNumber, SendData, (unsigned char)SendData[1], 0 );
とりあえず、Luarida 1.85Betaから3CPUに対応しました。動作確認はできていません。特にmipsはビルドしただけです。