2011年3月17日木曜日

Ubuntu 10.10 に Nexus S と XOOM を接続する

東北関東大震災(東北地方太平洋沖地震)で被害にあわれた皆様方に心よりお見舞いを申し上げるとともに犠牲になられた方々、遺族の皆様にはお悔やみを申し上げます。

私も東京にいますので、地震発生直後はいつもの地震だなって思っていましたが次第に大きくなり本棚等が倒れそうになり必死で抑えるのが精一杯でした。最初はTwitterで地震コメントを呟いたのですが、途中からは本棚を抑えながらも大量の地震コメントが流れてきました。
この時こそネットワークで繋がっているっていいなぁって思った改めて実感しました。

まだまだ被害の全容や刻々と変化する情勢に予断を許せる状況ではありませんが、災害に悲観しているだけでは復興の役にも立たないのでポジティブに仕事をすることで、僅かながら社会貢献することにしたいと思っています。


<Ubuntu 10.10 on VMWare Workstation>
私の環境はUbuntu 10.10をWindows 7 Pro 64bitのVMWare Workstationで稼働させています。この環境にNexux Sを接続します。とはいえ、普通に接続すれば問題ないのですが、物忘れが多い私の備忘録として記載します。

1)環境の準備
  • Ubuntu 10.10
  • Nexus S

 これだけなんですが、VMWare WorkstationはWindows 7 64bitで稼働させています。VMWare Playerでも同様に稼働できると思います。Nexus Sを例にしていますが、取り敢えずAndroid端末ならなんでも良いです。
 Android端末はUSBデバッグをONにしておきましょう。(笑

2)情報収集
  • Ubuntu 10.10上のAndroid端末情報を取得する。
    $ sudo lsusb
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 004: ID 18d1:4e22 Google Inc.
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    この結果からIDの隣である18d1がUSB Vendor IDになります。隣にある4e22は何だ?ってことになると思います。分かり難いですよね。詳しく見るには以下のコマンドを入力すると分かります。
    $ sudo udevadm info --query=all --name=/dev/bus/usb/001/004
    P: /devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1
    N: bus/usb/001/004
    S: char/189:3
    E: UDEV_LOG=3
    E: DEVPATH=/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1
    E: SUBSYSTEM=usb
    E: DEVNAME=bus/usb/001/004
    E: ID_VENDOR=Samsung
    E: ID_VENDOR_ENC=Samsung
    E: ID_VENDOR_ID=18d1
    E: ID_MODEL=Nexus_S
    E: ID_MODEL_ENC=Nexus\x20S
    E: ID_MODEL_ID=4e22
    E: ID_REVISION=0227
    E: ID_SERIAL=Samsung_Nexus_S_xxxxxxxxxxxxxxxx
    E: ID_SERIAL_SHORT=xxxxxxxxxxxxxxxx
    E: ID_BUS=usb
    E: ID_USB_INTERFACES=:080650:ff4201:
    E: ID_MEDIA_PLAYER=google_nexus-s
    E: MAJOR=189
    E: MINOR=3
    E: DEVTYPE=usb_device
    E: DRIVER=usb
    E: PRODUCT=18d1/4e22/227
    E: TYPE=0/0/0
    E: BUSNUM=001
    E: DEVNUM=004
    E: DEVLINKS=/dev/char/189:3
    ID_MODELにNexus Sを記載されていますし、ID_VENDOR_IDには先の値が入っています。(x16桁は端末シリアル番号です。)

3)udevのルール編集と
  • 51-android.rulesを新規で作成します。
    $ sudo vi /etc/udev/rules.d/51-android.rules
    SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", OWNER="ユーザ名", GROUP="ユーザ名"
    上記の"18d1"がID_VENDOR_IDになります。Android機器が異なる場合にはベンダ毎に変わります。Nexusシリーズの場合、Googleが製造していないのでNexus Sの場合にはサムソンになるのですが、サムソンは"04e8"なので別IDを利用していることになります。

  • udevの再起動
    $ sudo restart udev
    これで設定自体は完了しています。

  • adbの再起動
    ここで、一旦Android端末をUSBから接続を外し、再度接続し直します。
    $ adb kill-server
    $ adb start-server
    $ adb devices
    List of devices attached
    emulator-5554 device
    端末シリアル番号 device
    これで完了です。



<追記>
2月下旬に発注していたMotorola XOOMが2011/3/15に到着しました。レポートは後日としますが、Windows 7 64bit上でVMWare Workstationで稼働していますUbuntu 10.10でNexus S同様に接続しました。
上記ど同様にlsusbコマンドで調査し下記設定で問題なく動作しています。
$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="22b8", OWNER="ユーザ名", GROUP="ユーザ名"
Eclipse上のDDMSから画面キャプチャも問題なく出来るのですが、速度が遅いので
$ adb shell screencap -p /mnt/sdcard/capture.jpg
$ adb pull /mnt/sdcard/capture.jpg
で行う方がかなり速く取得できました。コマンド操作が面倒な方は通常通りで良いですが。(笑)

2011年3月10日木曜日

Android JNI で C++ を利用する

Android JNIでって話だとC言語サンプルはNDKにも付いてくるのだけど、C++となると情報が結構少ないので、備忘録として記載。

基本的に拡張子をcppにすることでコンパイルすることは出来ます。私のC++での開発経験はVisual C++(今はVisual Studioですよね)ではほとんど無い経験がありません。Borland Delphiを1.0から開発していたことが長かったので、C++はBorland C++ Builderだったのです。
#昨年はC++ Builderの講師の仕事もしていましたので・・・

何故こんな話をしているかというと、C++でclass定義というと「.h」にはクラス定義のみで、コンストラクタやデストラクタ、各メソッドは「.cpp」ファイルに記述していました。
#というか、勝手にテンプレートでそのように作られるんですね。

兎も角、「.h」「.cpp」のソースファイルを用意します。コンパイルするためには「Android.mk」を作成します。およそ以下のような感じになります。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := 「JNIライブラリ名」
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
include $(BUILD_SHARED_LIBRARY)

ヘッダーファイルが無い場合には良いのですが、定義する場合には「LOCAL_C_INCLUDES」を記述しなければなりません。
Android.mkファイルの各パラメタの詳細については、Android NDKでJNIを使用してアプリを高速化するには3/3を参照してください。

とまぁ、これで普通は終わりなのですが、Android NDK r4以降でC++特有のSTL(標準テンプレートライブラリ)が利用できるようになりました。とは言っても、βとのことなのですが。STLが利用できるようになると、なにかと便利になるのでこれを利用しないでC++を利用する価値はありません。
手元にNDK r4が無いので分かりませんがr5以降(r5bも含む)には2つのSTLが同梱されています。ひとつはGNU libstdc++ STLとSTLportです。どちらが良いかは各自の判断に任せるとして、利用方法は以下の通り。
「Application.mk」を作成します。
APP_STL := stlport_static
#APP_STL := gnustl_static

2行目をコメント化(#の付いた行)しているので、この場合にはSTLportを静的ライブラリ組み込みしてコンパイルします。たったこの一行で終わりです。
サイト検索すると、過去のNDKではSTLportを実行するためにソースをダウンロードしてコンパイルしてって作業が必要だったそうなのですが、現在はこんなに簡単になっています。

コンパイルは良いけど、ソースを記述する際にSTLportのインクルードヘッダーファイルは何処にあるのかって話になる。場所は「android-ndk-r5b/sources/cxx-stl/stlport/stlport」がヘッダーになります。
Eclipseでコーディングする際には、プロジェクトプロパティの「C/C++ General」->「Path and Symbols」->「Includes」のC++に追加することになります。

因みにgnu libstdc++を利用する際は「android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/include」ですね。

2011年3月8日火曜日

Motorola XOOM <途中経過>

Amazon.comのシステムを利用しているMotorola STOREですが、Standard Shippingを選択すると随分待たされてしまいました。

日本時間の2月26日午前中に予約を入れ、その時点での配達完了日程は3/3~3/8に。まぁStandard Shippingだとそんなものかなぁと思っていました。すると、夕刻には既に配達へのステータス変更になったので予定より早く到着するものと期待。

結果的にトラッキング番号は発行されましたが、到着前日で本日(3/8)に転送業者に到着しました。転送業者の検品でも問題がありませんでしたので無事、米国内は輸送されました。(笑)

日本に到着する予定はまだ不明ですが、来週末までには手元に届くものと思っています。


余談ですが、以下の取引経験からMotorola STOREも同じかなと推測したことが、思わぬ不安を招いたことになりました。

<私のAmazon.com取引経験>
Amazon.comでDVDとかを発注した場合ですが、2008年ぐらいまではStandardShippingを選択していても、予定(およそ2週間後~1ヶ月)よりも圧倒的に早く到着していました。
特に、在庫があれば発注からおよそ10日程度で手元に届いていたし、Standard Shippingでもトラッキングナンバーが発行されていました。
2010年ぐらいからAmazon.comの輸送が変更となり、国際輸送でのStandard Shippingではトラッキングナンバーは発行されなくなりました。
もちろん、輸送費用が高いオプションを選択すればこの限りではありません。

輸送日程も2010年からは10日程度から20日程度まで延びるので、確かに高価な輸送方法との差別化には成功しているようなのです。

2006年から利用していた私としては、うーん?って感じなのですが、Motorola STOREでも有効であることを今回体験しましたので、Amazon.comを利用したショップサイトでもStandard Shipping選択は到着日程が1ヶ月程度の余裕がある場合に限らないと、精神衛生上あまりよろしくないなぁと。

とはいえ、楽しい個人輸入ライフは辞められそうにありませんね。