Hatena::ブログ(Diary)

脱線こそ本道

2010-11-21

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

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/goking/20101121/p1