IS01ではBluetoothで遊べない?
手持ちのBluetooth対応のサーマルプリンタにIS01から印刷させてみようと試みましたが、どうもうまくいきません。
backport-android-bluetoothで組んでいて、デバイスの検索とかはちゃんと動作するのですが、いざRFCOMMで通信しようとBluetoothDevice#createRfcommSocketToServiceRecordを呼ぶと、以下のようなエラーが発生してしまいます。
11-21 19:52:55.787: ERROR/AndroidRuntime(16239): Uncaught handler: thread main exiting due to uncaught exception 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): java.lang.ExceptionInInitializerError 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at backport.android.bluetooth.BluetoothSocket.<init>(BluetoothSocket.java:69) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at backport.android.bluetooth.BluetoothDevice.createRfcommSocketToServiceRecord(BluetoothDevice.java:382) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at jp.haw.go.printit.PrintIt.onActivityResult(PrintIt.java:165) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.app.Activity.dispatchActivityResult(Activity.java:3636) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.app.ActivityThread.deliverResults(ActivityThread.java:3414) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3460) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.app.ActivityThread.access$2700(ActivityThread.java:134) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1969) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.os.Handler.dispatchMessage(Handler.java:99) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.os.Looper.loop(Looper.java:123) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.app.ActivityThread.main(ActivityThread.java:4403) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at java.lang.reflect.Method.invokeNative(Native Method) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at java.lang.reflect.Method.invoke(Method.java:521) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at dalvik.system.NativeStart.main(Native Method) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): Caused by: java.lang.UnsatisfiedLinkError: classInitNative 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.bluetooth.RfcommSocket.classInitNative(Native Method) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): at android.bluetooth.RfcommSocket.<clinit>(RfcommSocket.java:152) 11-21 19:52:55.887: ERROR/AndroidRuntime(16239): ... 16 more
どうも、RfcommSocketのインスタンスを生成しようとしているところで、classIntNativeというネイティブ関数を呼び出そうとして、UnsatisfiedLinkErrorが発生しているようです。と、言うことは、もしかしてIS01はRfcommSocketに関連するネイティブ関数を削除したりしているのでは…。
それを確認するために、
adb pull /system/lib/libandroid_runtime.so
して共有ライブラリをローカルに持ってきて、シンボルテーブルを確認してみました。すると、以下のように、RfcommSocketは見あたりませんでした。
$ objdump -T /home/rd/serial/libandroid_runtime.so | grep android_bluetooth 00065d09 g DF .text 00000028 _ZN7android36register_android_bluetooth_ScoSocketEP7_JNIEnv 00065589 g DF .text 00000028 _ZN7android48register_android_bluetooth_BluetoothAudioGatewayEP7_JNIEnv 00064539 g DF .text 00000028 _ZN7android38register_android_bluetooth_HeadsetBaseEP7_JNIEnv 0006f6a5 g DF .text 00000028 _ZN7android46register_android_bluetooth_BluetoothDunGatewayEP7_JNIEnv 0006f9fd g DF .text 00000108 _ZN7android42register_android_bluetooth_BluetoothSocketEP7_JNIEnv
ん〜IS01ではRfcommSocketが削除されているんだろうか(これだけで判断していいのか自信がないので、他の端末でも調べます)。
しかし、まあ、そうだとしたら、2.x系へのアップデートが無いのはいいとして、せめて遊べるようなアップデートはしてほしいなあ…IS01。
投稿直後に追記:
あれ、でも、よく見たら、BuletoothSocketなんてものがありますね。そのほかにもBluetoothDunGatewayとかも気になります。もしかすると、この辺りの実装を使っているのでしょうか??
http://www.adakoda.com/adakoda/2010/03/android-oesf-android-em1.html