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

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

ndk-buildの防備録

mipsx86版の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はビルドしただけです。