20130317改変

Android組込み開発
基礎コース
Armadillo-440 編

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-0
テキストのご利用に関して
・ 本コースのテキストは、 Creative Commons License BY-NC-SA
4.0に基づいて提供されています。改変の有無にかかわらず、商用
目的での利用は禁止されています。
・ 本教育プログラムは、その中で提供される教材全てを含め、OESF
からのいかなる保証もなしに提供されます。OESFは、本コースの内
容またはコースの詳細な情報を使用することに起因して、または
誤って使用することに起因して何らかの障害や法的な行為が生じて
も、いかなる責任も負いません。

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-1

1
トレーニングの目的
• LinuxとAndroidの違いを理解します
• LinuxとAndroidの起動手順の違いを理解します
• 組込みLinuxとAndroidの開発環境を構築できるよ
うになります
• Androidのビルドおよび実機での動作方法を理解
します
• 実機のデバッグ方法を理解します
• 演習を通してプラットフォーム開発を体験します

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-2

2
受講するに当たって必要なスキル
• OSの概念を理解している事
• Java言語またはC/C++言語の開発経験がある事
– 基本的なJavaやC/C++の言語仕様について理解があれば
問題ありません

• Linuxのコマンド操作経験がある事
– 演習では実際にLinuxコマンドを操作して移植作業を実
施します

• Eclipseを使用した経験がある事
– Androidのアプリケーション開発はEclipseを使用しま
す
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-3

3
目次
1章. Linux概要
2章. Android概要
3章.ターゲットのボード
4章.実機でAndroidを動かす(実習)
5章.デバイスの組み込み
6章. NDK/JNI概要
7章. シリアルデバイスアプリケーション作成(実
習)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-4

4
第1章

Linux概要

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-5
1章の概要
•
•
•
•
•
•

Linuxとは
ルートファイルシステム
起動シーケンス
Initの概要
組み込み向けOS
組み込みLinux

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-6

6
Linuxとは?






1998年~
オープンソースで完全フリーで世界中で最もよく使われている
GPLライセンス(ソースコードの公開義務)
UNIX*1のクローンなのでUNIXの一部資産が流用可能
リーナス・トーバルズ氏が開発/公開したOS :カーネルのみの提供(
kernel.org)
 Linus中心の強固な管理体制と安定性の確保
 主なLinuxシステム(ブートローダーやfsも含む)のディストリビューシ
ョン
 Debian系:パッケージ管理はdeb形式
 Debian GNU Linux、Ubuntu:
とが理念

コミュニティベース、100%フリーであるこ

 RedHat系:パッケージ管理はRPM形式
 Fedora、VineLinux : RedHatLinux後継のコミュニティによる実験
要素が強い

*1 : UNIXは現在BSD系UNIXとして存続(FreeBSD,NetBSD)

This material is Linux(商用)
 RedHat Enterpriselicensed under the Creative Commons License BY-NC-SA 4.0.

0-7

7
Debian系Linuxの起動シーケンス
Power ON or Reboot
initrd
起動に必要なドライバが格納さ
れている一時的なルートファイ
ルシステム(初期RAMディス
ク)

/etc/initt
ab

BIOS

ブートデバイスの専用ブロック読み出し

ブートロー
ダ
Boot カーネル
メモリに展開

基本設定
・ネットワーク
・キーボード
・デバイス初期化
デーモンの起動
(rcスクリプト経
login:hogetaro
由)

ini
t
シェル

password:
$

login

LILO/GRUBなど
起動パラメータの設定
CPU初期化
ハードウェアのチェック
ドライバ読みこみ
起動用ファイル(init)
が
ある領域のマウント
initは以下のいずれかの場所にある

/sbin/init, /etc/init,
/bin/init, /bin/sh

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-8

8
Debian系Linuxのinitが行う設定
• initが行う各種設定はinittabに記載されている情報
を元に行う
# デフォルトランレベル3
init

デーモン
1
デーモン
2

id:3:initdefault:
# ブート時の処理(システム初期化スクリプト)
si::systeminit:/etc/init.d/rcS
#各ランレベル用のrcスクリプトを実行し、その終了を待
つ
10:0:wait:/etc/init.d/rc 0
11:1:wait:/etc/init.d/rc 1
デーモン
12:2:wait:/etc/init.d/rc 2
3
13:3:wait:/etc/init.d/rc 3
14:4:wait:/etc/init.d/rc 4
15:5:wait:/etc/init.d/rc 5
16:6:wait:/etc/init.d/rc 6
# 1度だけ実行される処理(/sbin/update実行)
ud::once:/sbin/update
# 端末制御(ランレベル2~5で/sbin/mingetty実行)
# 終了されると再実行
1:2345:respawn:/sbin/mingetty tty1
:
# ランレベル5の時のログイン処理(/ etc/X11/prefdmを
実行)
0-9
# 終了されると再実行
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

/etc/initt
ab

9
Debian系Linux の inittabの書式
initdefa
ult

アクションの種
類
システム起動完了時に入るべきランレ
ベル

/etc/init.d/rcSがやること
∟/etc/default/rcSを実行
∟/etc/rcS.d内のスクリプト全てを実行
•
•
•
•
•
•

ホスト名の設定
クロックの設定
キーマップの設定
言語とフォントの設定
ハードディスクの検査と修復
ハードディスクのマウント

respawn

プロセスが終了したらすぐに再起動す
る

ondemand

respawnと同じだがオンデマンドラン
レベルが指定された場合のみ実行する

wait

プロセスが終了するまで待機してラン
レベルになったときだけ実行する

once

指定ランレベルになったときだけ一度
だけ実行する

ランレベルと動作モー
ド
0
Halt

off

何もしない

1

boot

システム起動中に実行する

シングルユーザモ
ード

bootwait

システム起動中に実行し、プロセスが
終了するまで待機

2
3
4

マルチユーザモー
ド
(text)

sysinit

システム起動中に実行する(
boot,bootwaitより先に実行される)

5

マルチユーザ(X)

6

reboot

ctrlaltd
el

SIGINTを受け取ったときに実行する Commons License BY-NC-SA 4.0.
This material is licensed under the Creative

0-10

10
Debian系Linux の
ルートファイルシステム

root
/

bin
boot
dev
etc
lib
mnt(media)
opt
proc
home/root
sbin
sys
tmp
usr
var

コマンド類
起動ファイル
デバイスファイル
設定ファイル
ライブラリ、カーネルモジュール
マウントポイント
追加アプリケーション
カーネル情報(cpu、process、メモリ情報の参照
ユーザのホームディレクトリ
システム管理コマンド(shtdown、mountなど)
システムレポジトリ
一時ファイル
各種ユーザプログラム
可変データ(ログ、キャッシュ、スプーラなど)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-11

11
組込み機器向けOSの条件

• 少ない資源(メモリ)で動作可
能
• リアルタイムオペレーティング
システム
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-12

12
従来の組込み向けOS
OS名

VxWorks

WindowsCE
T-kernel
T-kernel
Extension
Windows
Phone7

iOS

Symbian OS

提供

開発環境

主な用途

価格

対応PF

ウィンドリバー

Eclipse

組込み機器全般

有償
ソースコードは
別途購入

マイクロソフト

Windows CE
Toolkit for
Visual C++/Visual
BASIC
(Visual Studio)

組込み機器全般

有償
Closed Source

ARM他
多数

組込み機器全般

無償/有償
Open Source
(ただし独自の
ライセンス)

ARM
SH
M32

Visual Studio

WindowsPhone専用

プロプライエタ
リ
EULA形式の契約
書が必要

ARM

Apple

XCodeIDE

iPhone/
iPad専用

プロプライエタ
リ
EULA形式の契約
書が必要

ARM

Nokia

Carbide C++
(Eclipse)
MOAP,S60,UIQ3

携帯電話/スマー
トフォン

SDKは有償版と
無償版がある
OpenSource
0-13

ARM

T-Engineフォーラ
ム

MicroSoft

Eclipse for PMC
T-Kernel

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

ARM他
多数

13
組込み向けLinux
OS名

MontaVista
Linux

提供
米モンタビスタソフトウ
ェア

主な用途
携帯電話向け

価格

対応PF

有償

x86、
PowerPCMIPS
など

Wind River
Linux

Wind River

組込み機器全般

有償

x86、
PowerPC、
MIPS、

Tizen

Linux Foundation/LiMo
Tizen Association

組込み機器全般

無償
オープンソース

ARM
Intel(X86)

AxLinux

アックス

組込み機器全般

有償

ARM、OMAP
SHなど

組込み機器全般

オープンソース
ソフトウェアコン
ポーネント:提供
各社ライセンスに
よる

ARM他
多数

スマートフォン
タブレット

無償
オープンソース

ARM

Lineo uLinux

リネオ ソリューション
ズ株式会社

Android

Google & OHA

無償
ARM
オープンソース
OMAPなど
Tizen Association・・・docomo, intel, orange, Panasonic, SAMSUNG, NEC, Sprint, HUAWEI,
vodafoneなどが参加

Embedded Master

OESF

組込み機器全般

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-14

14
組込みLinuxの特徴
• Linuxカーネルに少数のフリーソフトウェアを組み合わせ
たもの
• 組込みCPUアーキテクチャのサポート
• ARM、MIPS、X86など

• RAMや二次記憶装置などの容量が小さい
• 2MB以下のメモリで起動可能

• 組込み機器のアプリケーションや対象ハードウェアに必要
な機能に特化
• MMUユニット※のないCPUでも動作可能(CONFIG_MMU=n)
• シングルプロセッサに最適化可能(CONFIG_SMP=n)
• NANDの直接使用(JFFS2、UBIFS)
• ファイルシステム
• マウント速度が速い(YAFFS2など)
• 読み出し専用(romfs)
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

※MMU:メモリ管理ユニット
0-15

15
組込みLinuxのリアルタイム性能
•ソフトリアルタイム (CONFIG_PREEMPT)
•ハードリアルタイム (CONFIG_PREEMPT_RT patch set)
•他のカーネルとの組み合わせでリアルタイム性を向上
•RTAI (Adeos+Linux)
•RTLinux (Realtime executive+Linux)
•Linux on ITRON (ITRON+Linux)
•T-Linux (T-Engine+Linux)
•L4-Linux (L4+Linux)
•Litron (TOPPERS/JSPカーネル+Linux)
•Wind River Real-Time Core for Linux (Real-Time
Core+Linux)

参考:http://monoist.atmarkit.co.jp/mn/articles/0501/12/news113.
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-16

16
組込みLinuxの開発環境
•一般的なツール
•Eclipse C/C++ Development Tooling (CDT) :EclipseでのCやC++の開発
に必須
•Target Management (RSE)
•Linux Tools Project :プロファイラや動的解析などの機能を統合
•Tools for mobile Linux (TmL)
•EGit :バージョン管理システムの一つ、Gitの統合
•Mylyn :バグトラッカの統合

•特定のOSに特化したEclipseプラグイン
•Moblin Eclipse Plug-in
•Android Development Tools (ADT)

•その他の開発環境
•Qemu:エミュレータ
•distcc、icecc:分散コンパイル用コンパイラ
•専用の商用製品など

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-17

17
組込みLinuxに関わる団体
• Linux Foundation (CE Linux Forumを吸収)
• Linuxオペレーティングシステムの普及をサポートする非営利のコンソー
シアム
• 旧CE Linux Forumが開催する定期的な無料イベント開催
• 日本テクニカルジャンボリー
http://tree.celinuxforum.org/CelfPubWiki/JapanTechnicalJamboreeGuidance

• LiMo Foundation
• Linuxを使った携帯電話のアプリケーション環境の標準化団体
• モトローラ、NEC、パナソニック、サムスン電子、NTTドコモ、ボーダ
フォンなど

• Open Handset Alliance (OHA)
• Googleとともに携帯向けAndroidの開発推進を行うアライアンス

• Open Embedded Software Foundation (OESF)
• 組み込み機器向けAndroidに関わる企業間の協力を目的とした一般社団法
人

• Linaro
• ARMのチップベンダである参加企業の各SoCに最適化されたツール、カー
ネル、ミドルウェアを提供することなどを目的とした非営利団体
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-18

18
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-19
第2章

Android概要

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-20
2章の概要
• Androidとは
– 主な機能、歴史

•
•
•
•

Androidアプリケーションの動作環境
Androidのアーキテクチャ
アプリケーション開発環境
プラットフォーム開発環境
– ソースコード
– ルートファイルシステム
– Androidの起動処理

• エミュレータ
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-21
Androidとは
Androidとは
GoogleとOHAが提供する携帯端末用プラットフォームである
主に携帯電話、タブレットなどのプラットフォームとして利用されている
現在では、携帯電話、タブレット問わずさまざまなハードウェアにAndroidは搭
載されている

マスタ タイトルの書式設定

AndroidはOS

AndroidはLinuxカーネルをベースにしたオープンソースなOSであるため多くのハ
ードウェアメーカーからプラットフォームとして採用されている

Androidのライセンス
主にApache2.0ライセンスなので複写・修正・再配布が自由
カーネルなどの一部はGPLライセンス

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-22
ハンドセット、タブレット以外の
Android
ノートPC
MediaController
腕時計型

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-23
Android組込みハードウェア

マスタ タイトルの書式設定

2-24
Androidの主な機能
【プラットフォーム全般】
ブラウザによるWebサイトの閲覧
→ベースはオープンソースWebKitエンジン

2D、3Dグラフィック
→カスタム2Dグラフィックライブラリ、 OpenGL/ES

軽量データベース
→構造化されたデータ領域のためのSQLite搭載

一般的なオーディオ、ビデオと静止画フォーマットをサポート
→MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF、WebM

Dalvik VM(ダルビック

バーチャルマシン)

→JavaVMよりもモバイル端末などの低メモリ環境に最適化

Bluetooth、EDGE、3G、WiFi、カメラ、GPS、コンパス、加速度計

【開発】
リッチな開発環境(Eclipse、DDMSなど)と端末エミュレータ
豊富で整ったアプリケーションフレームワークと拡張の自由
→コンポーネントの再利用と置き換えが可能

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-25

25
豊富なインタフェース
Androidのインタフェース

NFC

タッチパネル
各種センサ
トラックボール
カメラ
GPS
GPS
ソフトキーボード/ハードキーボード
NFC(Near Field Communication)
Bluetooth

Bluetooth

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

タッチパネル

0-26
Androidの歴史
年月

できごと

2003年10月

Android社発足

2005年 8月 GoogleがAndroid社を買収
2007年11月

Open Handset Alliance (OHA)が発足
Android SDK 1.0 リリース

2008年10月

世界初のAndroid搭載スマートフォン
発売

「T-Mobile G1」

2009年 4月 Android SDK 1.5r1 リリース
2009年 5月 Android SDK 1.5r2 リリース
2009年
月

7

NTTドコモより、日本国内初のAndroid携帯 「HT-03A」発
売

Android SDK 1.5r3 発表

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-27

27
Androidの歴史
年月

できごと

2009年 9月

Android SDK 1.6 発表

2009年10月

Android SDK 2.0 発表

2010年 1月

Android SDK 2.1 発表

2010年 5月

Android SDK 2.2 発表

2010年 12月

Android SDK 2.3 発表

2011年

2月

Android SDK 3.0 発表

2011年

5月

Android SDK 3.1 発表

2011年

7 月

Android SDK 3.2 発表

2011年 10月
2011年 12月

Android SDK 4.0
Android SDK 4.0.3

2012年 6月

Android SDK 4.1!

2012年 11月

スマートフォン向け

タブレット向
け

Android SDK 4.2

スマートフォン向け
と
タブレット向けの融
合

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-28

28
プラットフォーム
Androidのバージョン一覧

1.5

2.3

Cupcake

Gingerbread

Donuts

HoneyComb

2.0–2.1

4.0

Eclair

Ice Cream Sandwich

2.2

4.1-4.2

Froyo

Jelly Bean

マスタ タイトルの書式設定
3.0–3.2
1.6

2-29
Androidのバージョン 2.x系
2.x系の新機能
Version

コードネーム

APIレベル

リリース

新機能

2.0/2.1

Eclair

5, 6, 7

2009/10/26 (2.0)
2009/12/3 (2.0.1)
2010/1/12 (2.1)

• マルチタッチ
• LiveWallPaper
• Bluetooth

マスタ タイトルの書式設定
2.2

Froyo

8

2010/5/21

• Dalvik VM にJITコンパイラを搭載
(2〜5倍高速化)
• クラウドとデバイスの連携API
(C2DM)
• テザリング対応
• Adobe Flash対応
• インストール済アプリの自動更
新

2.3

Gingerbread

9, 10

2010/12/6

•
•
•
•
•
•

ゲームのための改良
並列GC(目標3ms以下の停止)
NFC(近距離無線通信)対応
複数のカメラを扱えるAPIの追加
SIPの標準サポート
バッテリー管理機能の向上

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-30
Androidのバージョン 3.x系
3.xの新機能
Version

コードネー
ム

APIレベル

リリース

新機能

3.0

Honeycomb

11

2011/2/22

• 大型ディスプレイに最適化
• タブレット専用となった
• マルチコアプロセッサのサポート

3.1

Honeycomb

12

2011/5/10

•
•
•
•

3.2

Honeycomb

13

2011/7/15

• 広範囲なタブレット向けの最適化
• SDカードに対してのメディア同期
• スクリーンサポートの拡張

マスタ タイトルの書式設定
ユーザーインターフェースの改善
オープンアクセサリAPI
USBホストAPI
マウス、ゲームパッド、ジョイス
ティックからの入力
• ホームスクリーンウィジェットのサ
イズ変更

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-31
Androidのバージョン 4.x系
4.xの新機能
Version

コードネー
ム

APIレベル

リリース

新機能

4.0

Ice Cream
Sandwich

14, 15

2011/10/08

•
•
•
•
•
•
•
•
•

4.1

Jelly Bean

16

2012/06/27

•
•
•
•
•
•
•

ハンドセットとタブレットのUIの統合
Android Beam
WiFi Direct
Bluetooth Health Device Profile
Notificationの向上
ロック画面で、カメラと音楽の操作
ランチャーのアプリ管理の改善
画像や動画のエフェクト
正確なカメラの測光、顔認識

マスタ タイトルの書式設定

Systrace
アクセシビリティの拡張
双方向テキスト対応
Unicode 6.0 の絵文字対応
Notificationの拡張
リサイズ可能なアプリウィジェット
ライトアウト・フルスクリーンモードへ
の遷移API
• Remoteable View の追加
• デバイスの追加と除去の検知
• Android Beam の改善

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-32
Androidのバージョン 4.x系
4.xの新機能
Version

コードネーム

APIレベル

リリース

新機能

• マルチアカウント
• クイック設定
• フォトギャラリーのアップデート。360
度撮影。
• ジェスチャ文字入力
• Miracast ワイヤレスディスプレイ
• Google Play 以外からインストールするア
プリにもマルウェアスキャン

マスタ タイトルの書式設定

4.2

Jelly Bean

17

2012/11/13

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

0-33
Androidのアーキテクチャ
アプリケーション
Home

Contacts

Phone

Browser

自作アプリ

・・
・

アプリケーションフレームワーク
アクティビティ
マネージャ

ウィンドウ
マネージャ

コンテンツ
プロバイダ

ビューシステム

通知マネージャ

パッケージ
マネージャ

電話
マネージャ

リソース
マネージャ

位置
マネージャ

XMPP
サービス

ライブラリ

自作
フレームワーク

Androidランタイム

サーフェス
マネージャ

メディア
フレームワーク

SQLite

コアライブラリ

OpenGL | ES

FreeType

WebKit

Dalvik
仮想マシン

SGL

SSL

Libc

自作ライブラリ

HARDWARE ABSTRACTION LAYER
Graphics

Audio

Camera

Radio(RIL)

WiFi

ディスプレイ
ドライバ

Bluetooth
ドライバ

カメラドライバ

フラッシュメモリ
ドライバ

バインダ(IPC)
ドライバ

キーパッド
ドライバ

USBドライバ

WiFiドライバ

オーディオ
ドライバ

電源管理

・・・

Linuxカーネル 2.6

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

自作ドライバ

0-34

34
カーネルとネイティブライブラリ
• Linuxカーネル2.6がベース
ベースに)
–
–
–
–

(ただし4.0以降のカーネルはほぼ3.1

Android用変更パッチ(電源管理、Binder、WakeLockなど)
ハードウェアのドライバ類
システムデーモン
GPLライセンス

• HAL (Hardware Abstraction Layer)
– Linuxのハードウェアドライバを抽象化しデバイスIO的な役割を果たす
– Androidのユーザランドとカーネルをライセンス的に分離

• ライブラリ
– Bionic libc
• Unix系libcよりも高速でコンパクト(pthreadの実装)
• BSDライセンス

– C/C++で記述されたライブラリ
• OpenGL/ES、SQLite、Webkitなど
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-35

35
Androidランタイム
•コアライブラリ
•Android用のJavaのコアライブラリで基本的なJava APIを提供
•J2SEをベースにしているので開発用ホストPCにJDKが入っていればアプリケー
ションの開発が可能
•未サポートであるJ2SEのAPIもあるので注意

•Dalvik仮想マシン(Dalvik VM)
•メモリの少ない環境でも複数のアプリケーションを同時実行できるように設計
•すべてのアプリケーションはDalvik VMのインスタンスとなって独自のプロセス
として動作
•JavaVM(スタックベース) ≠ DalvikVM(レジスタベース)
•Apache2.0
•アプリケーションのビルド時にdxツールがclassから.dexファイルに変換
(.dex≒.class/2)
•Dalvik VMにおける実行ファイルはdexファイル
Java VM
.class
.jar

異なる

Dalvik VM
.dex

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-36

36
アプリケーション層
• アプリケーションフレームワーク
– Androidアプリケーション作成のための拡張可能なJavaのコンポーネ
ント類
項目
説明
アクティビティマネー
ジャ

アプリケーションのライフサイクルや画面の共通バックスタックを管理

ウィンドウマネージャ

ウィンドウの配置や外観を管理するシステムソフトウェア

コンテンツプロバイダ

パッケージ間(異なるアプリケーション間)でデータ共有を行う手段を提
供する

ビューシステム

UIの制御

通知マネージャ

メッセージの到着、時間、アラームなどのイベント通知(ステータスバー
やトーストなど)

パッケージマネージャ

アプリのインストール、更新、削除などを管理

電話マネージャ

電話の状態や通話機能を管理

リソースマネージャ

アプリで使用するリソースの管理

位置マネージャ

GPSデバイスによる位置情報取得や更新などを実現、管理

XMPPサービス

XMPP(IMのメッセージ交換やログイン状況の通知用通信プロトコル)の
サービスを管理
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-37

37
アプリケーション層
• アプリケーション
– Google製標準アプリケーション
• アラーム時計、Bluetooth、ブラウザ、電卓、カメラ、コンタ
クトリスト、
検索ボックス、電子メールクライアント、ギャラリー、3Dギャ
ラリー、
インスタントメッセージ、ランチャー、音楽再生、
パッケージインストーラ、電話、システム設定、音声レコー
ダ、
スピーチレコーダー・・・など
– 独自アプリケーションはこのレイヤに該当する

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-38

38
アプリケーション開発の手法
アプリケーション

アプリケーション

アプリケーション

アプリケーション

アプリケーションフレームワーク

JNI

JNI

JNI

dalvikVM
ライブラリ
自前のライブラリ

Webkit

OpenGLES

OpenGLES

OpenGLES

・・・

HAL
Graphics

Audio

Camera

Radio(RIL)

WiFi

・・・

BIONIC
Libc

othread

Libm

Linker

・・・

Linuxカーネル 2.6
デバイスドライバ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-39

39
アプリケーション開発環境
項目

必要な環境

OS

Windows XP, Windows Vista(32 / 64 bit)
Mac OS X 10.5.8以降(x86のみ)
Linux(Ubuntu Hardy Herson、Lucid Lynx にてテス
ト済)

Java JDK
Android開発ツール
統合開発環境

JDK 6
Android SDK
3.7(Indigo) 以降
Android Development Tools(ADT) Plug-in

テキストベース
開発環境

Apache Ant(Windows版は1.7, Mac/Linux版は1.6.5以
降)

*必要なマシンスペックは http://developer.android.com/intl/ja/sdk/requireme
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-40

40
プラットフォーム開発環境
項目

必要な環境(共通)

スペック

CPU:2G以上、 メモリ:2G以上
ハードディスク空き容量:80G以上(プラットフォームひとつあたり20G
)
ネットワーク常時接続

ソースコード入手先
項目

Android Open Source Project (AOSP)
Froyo(2.2)より古いAndroidのソースコード取得やビルドに必要な環境

ホストOS

必要なツール

項目
ホストOS

必要なツール

Mac OS X 10.5.8以降(x86のみ)
32bit_Linux(Ubuntu 8.04 以上)(64bitLinuxの場合は下表参照)
Python 2.6 - 2.7、 git1.7以上、 GNU Make 3.81 -- 3.82、JDK5
git-core, gnupg, flex, bison, gperf, libsdl-dev, libesd0-dev,
libwxgtk2.6-dev, build-essential, zip, curl, libncurses5-dev,
zlib1g-dev, valgrind, libreadline5-dev, repo
Gingerbread(2.3)以上のAndroidのソースコード取得やビルドに必要な環
境
64bit_Linux(Ubuntu 10.04 以上)
Python 2.6 - 2.7、 git1.7以上、GNU Make 3.81 -- 3.82、 JDK6
git-core gnupg flex bison gperf build-essential zip curl zlib1gdev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev
ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32zdev
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-41

41
組込み開発とは
組込み機器のプラットフォーム開発はネイティブ言語で開発(gcc)を行う
【必要な作業】
1.

ホストPCにてクロス開発環境構築
–

2.
3.

ホストPCにてカーネル作成
ターゲットボードに移植
–

4.
5.

ターゲットボードのチップのアーキテクトに適用したクロスコンパイル環境で
あること
(ARM, x86, ・・・)

(必要であれば)デバイスドライバ作成、組み込み

ホストPCにてユーザランド作成
ターゲットボードのメモリに書き込み、起動、評価

【ターゲットボードに最低限必要なインタフェース】
–
–
–

ネットワークポート(LANなど)
シリアルポート(RS232Cなど)
JTAG (ICE接続などに使用)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-42

42
Androidのクロス開発環境
Ubuntu
追加パッケージ

ホストPC (X86)
Ubuntu on VMWarePlayer

ターゲットボード
(ARM)
Armadillo-440

LAN or シリアル

AOSP

ボードベンダなど

ソースコード取得
編集
コンパイル
カーネルイメージ作成
ユーザランドのルートファイルシステム作成
実機へ転送

デバッグ

*1 : コンパイラ(gcc)、プリプロセッサ & リンカ & アセンブラ(bin-utility)、
Cライブラリ、ダイナミックローダ などビルドに必要なツール一式
*2 : Linuxカーネル、ユーザランドのソースコード
*3 : ボードに搭載しているハードウェアに依存するドライバやAndroidとの差異を吸収するパッチ
ブートローダーなど
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-43

43
本実習で使用するホストPC構成
ゲストOS Ubuntu ver. 10.04.LTS
32_bit x86版
VMWarePlayer
ver.4.04
ホストPC WindowsXP SP3 or 7
(32_bit x86マシン)
VMWare Player入手先サイト
下記サイトからメジャーバージョン4.0、マイナーバージョン4.04を選択し、
「VMware Player for Windows 32-bit and 64-bit」をダウンロードします
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/4_0|P
LAYER-406|product_downloads

Ubuntu 10.0.4LTS入手先サイト
Ubuntu 10.0.4LTS CDイメージ(iso) はサポート期間が終了してしまったため、下記
サイトから
「PC (Intel x86) alternate install CD」をダウンロードします。
http://releases.ubuntu.com/lucid/
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-44

44
Ubuntu on VMWarePlayer
インストールウィ
ザードに
必要な項目を入力し
てインストール開始

ディスクトップ
にVMWarePlayer
のショートカッ
トができるので
ダブルクリック
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-45
Ubuntu on VMWarePlayer

ディスク容量…80G
ネットワーク…NAT
メモリ…最低2G以上割り当てる

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-46

46
Ubuntu on VMWarePlayer

Ubuntuのisoイメージをダウンロードした場所

「ISOイメージ
ファイルを使用
する」にチェッ
クをいれて
参照ボタン押下

「OperationSystem not found」
と表示されて止まったらEnterキーを押下
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-47

47
Ubuntu on VMWarePlayer
インストール
ウィザードに
必要な項目を
入力してイン
ストール開始

インストール
が完了すると
再起動を促さ
れるので再起
動をする

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-48

48
Ubuntu on VMWarePlayer
初回インストール時はアップデートマネージャにてセキュリティ
アップデートをする

*社内ネットワークなどproxyの関係で失敗する場合はproxyの設定を正しく行ってからリ
トライしてください
0-49
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

49
本実習のクロス開発環境の構築
ホストPCがUbuntu ver.10.0.4LTS (32_bit x86版)の場合
必要なツールのインストール
$ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev
libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
$ sudo apt-get install valgrind
$ sudo apt-get install libreadline5-dev

JDK5のインストール
Oracleのサイトからlinnux用のバイナリをダウンロードします( jdk-1_5_0_22-linuxi586.bin)
http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archivedownloads-javase5-419410.html#jdk-1.5.0_22-oth-JPR
$ chmod a+x jdk-1_5_0_22-linux-i586.bin
$ ./jdk-1_5_0_22-linux-i586.bin
$ mv jdk1.5.0_22 java-5-oracle
$ sudo mkdir /usr/lib/jvm
$ sudo mv java-5-oracle /usr/lib/jvm
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-50

50
本実習のクロス開発環境の構築
JDK5のインストール(続き)
下記の/update-java-0.5bツールを実行後ダイアログが表示されるので
「/usr/jvm/java-5-oracle」を選択して「OK」すれば完了
$ wget http://webupd8.googlecode.com/files/update-java-0.5b
$ chmod +x update-java-0.5b
$ sudo ./update-java-0.5b

repoのインストール
$ mkdir ~/bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo

※export PATH=$PATH:~/bin を .bashrc へ追記

ホストPCがUbuntu 10.0.4 (64bit x86版)の場合:http://source.android.com/source/downlo
0-51
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
51
android open source project
(AOSP)
http://source.android.com/

Androidのソースコードはgitプロジェクト単位(リポジトリ)にTree構
造となっている
コミッターは個々のリポジトリをフォークして変更を加え、本Treeにコ
ミットしている
AOSPのkernel以外の全リポジトリは
https://android.googlesource.com/platform/manifest
0-52
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
で管理されている

52
Android のバージョン対応表
Androidの指定バージョンのソース
コードを取得する場合はAOSPの
BuildNumbersで記載されている
Code nameまたはTagを指定する
Code name

Version

API level

(no code name)

1.0

API level 1

(no code name)

1.1

API level 2

Cupcake

1.5

API level 3, NDK 1

Donut

1.6

API level 4, NDK 2

Eclair

2.0

API level 5

DMD64

android-1.6_r1.5

latest Donut version

Eclair

2.0.1

API level 6

EPF21B

android-2.1_r2.1p2

latest Eclair version

Eclair

2.1

API level 7, NDK 3

FRK76C

android-2.2.3_r2

latest Froyo version

Froyo

2.2.x

API level 8, NDK 4

GWK74

android-2.3.7_r1

Gingerbread

2.3 - 2.3.2

API level 9, NDK 5

latest Gingerbread version,
Nexus S 4G

ITL41D

android-4.0.1_r1

Gingerbread

2.3.3 - 2.3.7

API level 10

earliest IceCreamSandwich
version, Galaxy Nexus

Honeycomb

3.0

API level 11

ITL41D

android-4.0.1_r1.1

Galaxy Nexus

Honeycomb

3.1

API level 12, NDK
6

ITL41F

android-4.0.1_r1.2

Galaxy Nexus

ICL53F

android-4.0.2_r1

Galaxy Nexus

Honeycomb

3.2.x

API level 13

IceCreamSandwich

4.0.1 - 4.0.2

IceCreamSandwich

4.0.3

Build

Tag

IML74K
android-4.0.3_r1
API level 14, NDK
IML77
7
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
API level 15

Notes

Nexus S
latest IceCreamSandwich
0-53
version

53
Androidのソースコード管理
(Git)
• Gitとは
– 分散型バージョン管理システム
– 複数リポジトリ間での変更履歴のやり取りが可能
– Linux kernelのソースコード管理に利用されている
【gitサーバにあるリポジトリのコピー】
$ git clone https://android.googlesource.com/platform/manifest +
project path
例1:フレームワーク関連の最新のソースコードを取得する場合
$ git clone https://android.googlesource.com/platform/frameworks/base.git
例2:フレームワーク関連のFroyoのソースコードを取得する場合
$ git clone https://android.googlesource.com/platform/frameworks/base.git –b
android-2.2.3_r2
または clone https://android.googlesource.com/platform/frameworks/base.git –b froyo
$ git

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-54

54
Androidのソースコード管理
(repo)
• repoとは
– Gitの複数リポジトリを一括で管理するためのツール

【gitサーバにあるkernel以外のすべての標準プロジェクトを
一括で取得】
$ repo init -u https://android.googlesource.com/platform/manifest
project path
$ repo sync

+

$ repo init -u https://android.googlesource.com/platform/manifest
例1:最新のソースコードを一括取得するためのリポジトリの作成する場合
$ repo init -u https://android.googlesource.com/platform/manifest –b android例2:Froyoのソースコードを一括取得するためのリポジトリの作成する場合
2.2.2_r1

または init -u https://android.googlesource.com/platform/manifest
$ repo

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

–b froyo
0-55

55
AOSPのソースコード取得
android-2.2.2_r1のタグのついたAndroid2.2(Froyo)のコードを取得するには
$ mkdir mydroid
$ cd mydroid
$ repo init -u https://android.googlesource.com/platform/manifest –b android2.2.2_r1
$ repo sync

上記 repo init コマンドでレポジトリの初期化を行うと.repoディレクトリが生成
$ ls .repo
msnifst.xml@

manifests/

manifests.git/

repo/

manifest.xml@ (-> manifests/default.xml) にはrepo が管理する対象のプロジェ
クトが定義
manifest.xml にないプロジェクトの追加またはmanifest.xml からプロジェクトを外す場合
local_manifest.xml を作成することによってカスタム設定が可能
<?xml version=“1.0”encoding=“UTF-8”?>
<manifest>
削除
<remove-project name=“platform/frameworks/base” />
<project path=“frameworks/base” name=“platform/frameworks/base” revision=“android- 追加
2.2.3_r1”/>
</manifest>

パス名

プロジェクト名

指定のタグ名(任意)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-56

56
repo sync 後のソースコードツリー

mydroid/

bionic/
bootable/
build/
cts/
dalvik/
development/
external/
frameworks/
hardware/
packages/
prebuild/
system/bluetooth
system/core
system/extras

Android用に開発されたCライブラリ
ブートローダーリファレンスコード
ビルドシステム
テストスイート
仮想マシンDalvik
開発ツール、SDK、サンプルコード
AOSP以外の外部オープンソースプロジェクト
Androidアプリケーションフレームワーク
ハードウェアライブラリとRadio Interface
標準的なAndroidアプリケーションとサービス
ビルドに必要な各種バイナリファイル
Bluetoothツール
最小限の実行環境
低級なデバック、テストツール

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-57

57
ソースコード詳細(packages)
• packages

-> アプリケーションレイヤ

– apps : Android標準搭載アプリケーションのソース
コード
– inputmethods : 入力用メソッドのソースコードが格
納
– providers : Android標準搭載サービスのソースコー
ド
– experimental : 製品には入らないテストツール
– wallpapers : ライブ壁紙のソースコード

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-58

58
ソースコード詳細
(packages/frameworks)
• frameworks -> フレームワークレイヤ
– base
• Androidフレームワークのソースコードと各種サービスのソー
スコード
• base/core : Androidランタイムのコアライブラリ
• base/libs : 外部プロジェクトのライブラリ

– opt : googleや絵文字のライブラリソースコード
– policies : mid、phoneの構成情報
• dalvik -> Androidランタイム
– Dalvik仮想マシン本体の関連クラスライブラリ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-59

59
ソースコード詳細(bionic/external)
• external -> ライブラリレイヤ
– 外部プロジェクトのライブラリ
• bionic -> ライブラリレイヤ
– BSDライセンス
– POSIX標準Cライブラリのすべての機能は実装してい
ない
– 未サポート機能
•
•
•
•
•

C++例外
pthreadキャンセル
pthread_coreのinitメソッドからスローされたC++例外
pthread_coreのfork()するinitメソッド
ロケールとワイルドキャラクタ(UnicodeライブラリICUで代
替)
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
• ユーザアカウント関連のメソッド(getpwdなど) 0-60

60
ソースコード詳細(hardware)
• hardware -> HAL
– broadcom : Broadcomの無線ドライバ
– libhardware :外部モジュールで構成されたデバイスドラ
イバ制御用ラッパーライブラリ
(外部モジュールの配置場所は/system/libs/hw配下)
– libhardware_legacy : スタティックリンクされる定義で
構成されたデバイスドライバ制御用ラッパーライブラリ
(WiFi、バイブレーション、電源、GPSなど)

– msm7k : QualcommのMSM7K関連
– qcom : QualcommのGPSドライバ
– ril : Radio Interface Layer
テレフォニーサービスのベースバンドIF
– ti : TIの無線ドライバ
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-61

61
ソースコード詳細(system)
•system
–Initなどの基本的なプロセスのコードやシステム
ファイルなど
–bluetooth : bluetoothのソースコード
–core : 必要最小限の実行環境、基本的なコマンド
類
–extras : デバッグ、テストツールが格納
–netd : ネットワーク設定制御用デーモン
–vold : ボリュームデーモン、各種メディアのマウ
ント
–wlan : TIの無線関連のソースコード
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-62

62
ソースコード詳細(開発環境関連)
•

build
– ビルドシステム(Makefile、スクリプトなど)を格納
– Androidソースコードのルートでmakeするとbuild/core/main.mkからmake開始

•

prebuild
– 各ターゲット用、ホストOS用のビルドツールのバイナリファイル(クロスコンパイ
ラ)

•

device
– 機器に関するbuild関連の情報(Makefile)、CPUやボードに依存するソフト(スク
リプト)やドライバなど

•

ndk
– Native Development Kit関連のソフト、gdbなどのツール

•

sdk
– Android SDKで使用されるエミュレータソフトやライブラリ

•

bootable
– bootloader : ブートローダーのソースコードが格納
• bootloader/legacy/usbloader/main.cがブートローダーのスタート関数

– diskinstaller : x86系PCにAndroidをインストールする際に使用
– recovery : Android system recovery utilityのソースコードが格納

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-63

63
ソースコード詳細(開発環境関連)
• cts
– 互換性テストスイーツ、デバイスの互換性をテストするためのツ
ール
など
– Android認証テスト
– Android Marketなどを使用できるようにするにはGoogleの認証が必要

– CTSが通らなければAndroid端末として認証されない(かなり厳格)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-64

64
Androidのエミュレータと実機
プラットフォームが入れ替わるだけで実はエミュレータと実機は同じ
ARMのエミュレートをしているのはQEMUエンジン

Javaプログラム
Dalvik VM

Javaプログラム
Dalvik VM

Linux ARM版

Linux ARM版

ARM仮想マシン
(QEMU)
PC

ARM実機マシン

Androidエミュレータ

Android実機マシン

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-65

65
Androidの起動シーケンス
Power ON or Reboot
BootROM

/init.rc
基本設定
・ネットワーク
・キーボード
・デバイス初期
化
サービスの起動

ブートローダ
Boot カーネル
メモリに展開

/in
it

ブートデバイスの専用ブロック読み出し
U-Boot or Hermit
起動パラメータの設定

CPU初期化
ハードウェアのチェック,
ドライバの読みこみ
起動用ファイルがある領域の
マウント

kernelの起動パラメータ設定時
必ずinit=/initを指定すること

Home画面

デフォルトの設定ではカーネルは
/sbin/init、/etc/init、/bin/init、
/bin/sh
にinitを探しにいくので正常に起動でき
0-66
ない
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

66
Android カーネルの起動パラメータ
本実習で使用するArmadillo-440はブートローダにhermitを使用します
カーネルの起動パラメータを設定するためには、開発PCとArmadillo-440を
RS232Cで接続後、hermitプロンプトからsetenvコマンドで以下のように設
定します
hermit>setenv␣console=ttymxc1␣root=/dev/mmcblk0p2␣init=/init␣noinitrd␣ rootwait
パラメータ

説明

console=ttymxc1

カーネルコンソールはデバイスttymxc1を使用

noinitrd

initrd(初期RAMディスク)を使用しない

root=/dev/mmcblk0p2

MMC(SDカード)の2番目のパーティションをルートファイルシ
ステムとする

rw

Read/Writeでルートファイルシステムをマウント

rootdelay=1

ルートファイルシステムをマウントする前に指定秒間待機

rootwait

ルートファイルシステムがアクセス可能になるまで待機

nfsroot

nfsrootNFSを使用する場合に、ルートファイルシステムの場所
やNFSオプションを指示

init=/init

initの実行ファイルはルート直下にあるinitを使用
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-67

67
Androidのinit
init /system/core/init/init.c
int main(int argc, char **argv)
{
ブート処理

/dev、/proc、/sysをマウン
ト

/init.rc
をパースして実行
- action_list作成
- service_list作成

起動時に一度だけ実行される

/init.<hardware名>.rc
をパースして実行
- action_list作成
- service_list作成

for(;;){
デーモン処理
システムが動作している限
り
繰り返し実行される

}

}

ファイルディスクリプ
タの
監視

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

device_fd
property_fd
signal_fd
keychord_fd
0-68

68
Androidのinit
• initの起点
– /system/core/init/init.c の main関数

• init.rc
– Android Init Languageで書かれた起動用スクリプト
– Action、Command、Service、Optionで構成
– /system/core/init/readme.txt で説明

ACTION部
on <target>

<command>
<command>
:

SERVICE部
service <name> <path> [argument]*

<option>
<option>
:

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-69

69
Androidのinit(デーモン処理)
• ファイルディスクリプタ
– device_fd
• カーネルからデバイスの状態変化通知を受けて/dev以下のデバ
イスの生成と削除を行う。
• 生成するデバイスファイルのmode、uid、gidはdevices.cの構
造体かinit.rcのdeviceコマンドで指定可能

– property_fd
• システムプロパティの書き込み処理

– signal_recv_fd
• 子プロセスが終了したときにsignalを発生するのでそれを受け
て後処理を行う

– keychord_fd
• あらかじめ登録した複数のキーの入力組み合わせを監視しそれ
に対応するserviceを起動する

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-70

70
Androidのルートファイルシステム
data

root
/

キャッシュ、追加パッケージなど格納ディレクト
(R/W)
dev
デバイスファイル格納ディレクトリ
proc
Linux設定ファイル格納ディレクトリ
sys
システムファイル格納ディレクトリ
sbin
adbd実行ファイル格納ディレクトリ
system
次頁参照
init
起動処理実行ファイル
init.armadillo440.rc
initが実行するターゲットボード固有
起動用シェルスクリプト
init.rc
initが実行するAndroid固有起動用シェルスクリ
default.prop
Androidデフォルトプロパティ
init.goldfish.rc エミュレータ起動用シェルスクリプト
initlogo.rle
起動時のロゴの画像ファイル
(RGB888のRAW形式をRLE形式に変換した画像 )
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-71

71
Androidのルートファイルシステム
app

/system/

bin
etc
fonts
framework
lib
usr
xbin
build.prop

プリインストールのアプリケーション
ファイル(.apk)
各種一般的なLinuxコマンド
設定用シェルスクリプトなど
フォントファイル(.ttf)
javaのandroidのライブラリ(.jar)
ネイティブライブラリ(.so)
キー設定ファイルなど
root用のコマンドなど
Androidデフォルトプロパティ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-72
1章と2章のまとめと次回予告
以上で一般的なLinuxの概要とAndroidの概要に
ついて学びました
次章からは本実習で使用するターゲットボードの
理解とAndroidを動作させる方法について学びます

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-73
メモ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-74
第3章

ターゲットのボード

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-75
3章の概要
•
•
•
•
•

代表的なターゲットボード
Armadillo-500fxの構造
Armadillo-500fxのメモリ構成
Armadillo-440の構造
Armadillo-440のメモリ構成

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-76
各種ターゲットボード
ボード名

CPU

メモリ

画面

通信

I/F

ストレー
ジ

カメラ

オーディオ

Armadillo-440
液晶モデル開発
セット

Freescale
i.MX257
400MHz
(ARM9)

32MB
(FLASH NOR)
128MB
(LPDDR SDRAM)

4.3イ
ンチタ
ッチパ
ネル

Eth×1

シリアル、
USB

microSD

-

オーディオ入
出力

Armadillo-500fx
液晶モデル開発
セット

Freescale i.MX31
532MHz
(ARM11)

32MB(FLASH NOR)
128MB(DDR SDRAM)
1G(USBSSD)

5.7イ
ンチタ
ッチパ
ネル

Eth×1

シリアル、
USB、操作ボ
タン

SD/MMC+mic
roSD

-

オーディオ入
出力

Armadillo-800EVA
評価キット

ルネサス
[R-Mobile A1]
800MHz 2コア
ARM Cortex-A9

512MB
(DDR SDRAM)
8G(eMMC)

5イン
チタッ
チパネ
ル
(静電
式)

Eth×1
WLAN

シリアル
USB HOST/OTG
HDMI

SD/MMC+mic
roSD

CMOSカメ
ラモジュ
ール

オーディオ入
出力

BeagleBoard

TI OMAP3530
600MHz
(ARM11)

256MB
NAND
DDR2 RAM

-

-

シリアル、
USB

SD/MMC

-

オーディオ入
出力

BeagleBoard-xM

TI DM3730
1.0GHz
(ARM Cortex-A8)

512MB
NAND
DDR2 RAM

-

Eth×1

シリアル、
USB

microSD

拡張端子

オーディオ入
出力

PandaBoard

TI OMAP4430
1GHz 2コア
ARM Cortex-A9

1GB
DDR2 RAM

-

Eth×1
BT2.1+EDR
WLAN

シリアル
USB HOST/OTG
HDMI、DIV-D

SD/MMC

拡張端子

オーディオ入
出力

PandaBoard-ES

TI OMAP4460
1.2GHz 2コア
ARM Cortex-A9

1GB
DDR2 RAM

-

Eth×1
BT2.1+EDR
WLAN

シリアル
USB HOST/OTG
HDMI、DIV-D

SD/MMC

拡張端子

オーディオ入
出力

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-77
ターゲットボード

ボード名

提供元

購入先

価格

Armadillo-440 液晶モデル開発セット

アットマークテクノ社

アットマークテクノ社

128,000(税込)

Armadillo-500fx液晶モデル開発セッ
ト

アットマークテクノ社

アットマークテクノ社

63,000(税込)

Armadillo-800EVA評価セット

アットマークテクノ社

アットマークテクノ社

99,750(税込)

BeagleBoard

TI/Digi-Key
Beagleboard.org

Digi-Key

$125

BeagleBoard-xM

TI/Digi-Key
Beagleboard.org

Digi-Key

$149

PandaBoard

Pandaboard.org

Digi-Key

14,061(送料
・消費税・関税
込)

PandaBoard-ES

Pandaboard.org

Digi-Key

15,136(送料
・消費税・関税
込)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-78
Armadillo440

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-79
Armadillo440
プロセッサ
CPUコア

Freescale i.MX257 (MCIMX257)
ARM926EJ-S

CPUコアクロック

400MHz

BUSクロック

133MHz

メモリ

128MB (LPDDR)
32MB (NOR)

USB

USB2.0×2(High Speed/FullSpeed)

タッチパネルインタ
ーフェースボード

抵抗膜式タッチスクリーンコントロ
ーラー

SD
シリアルポート

microSDスロット
RS232C、

オーディオ

I2S I/F、デジタルオーディオCODEC

画像出力

18bit LCD I/F、DATA IMAGE社製LCD
インターフェース

EthernetFXボード

LAN (10BASE-T/100BASE-TX )

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-80
Armadillo440-通常Linux
開発用PC

カーネルの起動パラメータ

[armadillo] hermit> clearenv
[armadillo] hermit> setenv
[armadillo] hermit> boot

シリアル通信ソフ
ト

NOR Flashメモリ(32M)
linux-440.bin.gz
をRAMにロードして実行

bootloader
ブートローダ領域(Hermit)

kernel
Linuxカーネル領域

userland
Linuxユーザランド領域

linux-romfs440をマウント
各プロセスの実行

config
Linuxカーネルパラメータ保存領域

通常Linuxが起動
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-81

81
参
考

Armadillo440-Androidデバッグ時
(NFSブート)
開発用PC

カーネルの起動パラメータ
[armadillo] hermit>
setenv␣console=ttymxc0,␣115200␣root=/dev/nfs␣rw␣nfsroot=192.16
8.1.10:/home/mydoroid/out/target/product/genelic/root␣init=/i
nit␣ip=102.168.1.11␣noinitrd
[armadillo] hermit> boot

NOR Flashメモリ(32M)
linux-440android.bin.gzをRAMに
ロードして実行

シリアル通信ソ
フト
Androidユーザランド
android-rootfs

192.168.1.1
0

bootloader
ブートローダ領域(Hermit)

Android対応kernel
Linuxカーネル領域
linux-440-android.bin

userland
Linuxユーザランド領域

config
Linuxカーネルパラメータ保存領域

NFSルートマウント
root=/dev/nfs
マウント
各プロセスの実行

Androidが起動
LAN接続
192.168.1.11

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-82
Armadillo440-Androidデバッグ時
(microSDブート)
開発用PC

カーネルの起動パラメータ
[armadillo] hermit>
setenv␣console=ttymxc1␣root=/dev/mmcblk0p2␣init=/init␣noinitr
d␣rootwait
[armadillo] hermit> boot

シリアル通信ソフ
ト

NOR Flashメモリ(32M)
linux-440-android.bin.gz

をRAMにロードして実行

組み込み済み

bootloader

ブートローダ領域(Hermit)

Android対応kernel

ルートマウント
root=/dev/mmcblk0p2
マウント
各プロセスの実行

Linuxカーネル領域
linux-440-android.bin

userland

/dev/mmcblk0

microSD
Android /dev/mmcblk0p2
rootfs

Linuxユーザランド領域

config

Androidが起動

Linuxカーネルパラメータ保存領域

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-83
Armadillo440-Android
製品イメージ
開発用PC

カーネルの起動パラメータ

[armadillo] hermit>
clearenv
[armadillo] hermit> boot

シリアル通信ソフ
ト

NOR Flashメモリ(32M)
linux-440-android.bin.gz

をRAMにロードして実行

組み込み済み

bootloader

ブートローダ領域(Hermit)

Android対応kernel
Linuxカーネル領域
linux-440-android.bin

Androidのルートをマウント
各プロセスの実行

Androidが起動

/dev/mmcblk0
/dev/mmcblk0p1
マウント

Android
/system(RO)

Androidルート
Root(RO)

config

microSD

/dev/mmcblk0p2
マウント

Android
/dara(RW)

Linuxカーネルパラメータ保存領域

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-84
メモ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-85
第4章 実機でAndroidを動かす

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-86

86
4章の概要
•
•
•
•
•
•
•
•
•

目指すシステム
Androidソースコード取得
Androidカーネルイメージ作成
Androidユーザランドのファイルシステム作成
Androidユーザランドのファイルシステム構成
Armadillo-440の標準Linuxとネットワーク設定
Android起動用microSDの準備とAndroidカーネルの準備
Android起動
デバッグ環境の構築
–
–
–
–

Android SDK のインストール
ネットワーク設定
ddms
adbコマンドとadb shellコマンド

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-87

87
本章で目指すシステム
Armadillo-440に搭載させたmicroSD内のEM3で起動
する
/dev/mmcblk0

microSD
Android
rootfs

/dev/mmcblk0p2

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-88

88
Linuxコマンドの復習
●UbuntuのターミナルのシェルではTabキーでディレクトリ名やファイル名の補完ができま
す
●ホームディレクトリについて
本実習の開発環境におけるユーザ(aj741327)のホームディレクトリは以下のディレクトリ
です

/home/aj741327
●Linuxではホームディレクトリのことを【 ~/ 】で簡略化して表現することができます。
<使用例>
ホームディレクトリにあるworkというディレクトリに移動したい場合

cd /home/aj741327/work
cd ~/work

同じ

●ワイルドカード「*」
Aというディレクトリ内にあるすべてのjavaのソースファイルをまとめて指定したいときな
ど「*」を利用して
以下のように指定できます

A/*.java

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-89
Linuxコマンドの復習
pwd

現在のディレクトリパスを表示

cd

ディレクトリ間移動

cd ../ 一つ前のディレクトリに移動

ls –la

カレントディレクトリのファイルを
一覧表示

-l : ファイルの詳細も示す
-a : .ファイル(隠しファイル)も表示

cp A B

ファイルのコピー

A:コピー元ファイル名 B:コピー先ファイル名

mv A B

ファイルの移動、ファイル名の変更

A:元ファイルファイル名 B;移動先ファイル名

rm A

ファイル、ディレクトリの削除

-r –R :ディレクトリ内の削除
-f :警告メッセージを表示しない
-d:ディレクトリごと削除(スーパーユーザのみ)

mkdir A

ディレクトリの生成

-p:指定したディレクトリをサブディレクトリごと
作成する。ツリー状のディレクトリも作成可能

chmod モード A

パーミッションの変更

Aというファイルをモードで指定したパーミッショ
ンに変更
モード:777(全ユーザにrwxの権限)やa+x(全ユ
ーザに実行権限)

chown usr01 A
chown usr01:g1 A

ファイル所有者の変更

Aの所有者をuser01に変更
Aの所有者をuser01、所属グループg1に変更
-R :ディレクトリとその中野ファイルの所有者を
変更

fdisk

パーティションの作成、削除、変更

mkfs

ファイルシステムの作成(フォー
マット)

-t fstype 作成するファイル・システムを指定する

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-90
Linuxコマンドの復習
mount A B

ファイルシステムのマウント

AをBにマウントする

umount B

ファイルシステムのアンマウント

Bをアンマウントする

ps

実行中プロセスの情報表示

top

プロセスの稼動状況などのリアルタイム
表示

env

環境変数の表示

export

環境変数の設定

exit

現在のユーザのログアウト

reboot

システムの再起動

sudo

別ユーザでコマンド実行

cat

テキストファイルの内容を閲覧、ファイ
ルの連結

less

ファイルの内容をページ単位で表示

gzip A

gzファイルに圧縮

Aを圧縮する
-d:圧縮ファイルを展開する

tar オプ
ション
A.tar (/A)

アーカイブの作成、展開やtarファイル
の圧縮、解凍

tar cvf A.tar /A:/Aディレクトリ以下をA.tarという名前で
アーカイブする
tar xvf A.tar:A.tarというアーカイブをすべて展開する(
処理経過表示)

ftp

コンピュータ間のファイルの送受信

ftp 192.168.1.11

ping

コンピュータ間の接続状態のテスト

ping 192.168.1.11

export <環境変数名>=<パス>

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-91
EM3とは
EM(EmbeddedMaster)とはOESFのディストリビューション ワー
キンググループを中心に仕様策定、構築、公開をしている
組込み機器向けのAndroidのディストリビューションのシリー
ズです
http://www.oesf.jp/
Androidのフレームワークに準拠
し、AndroidのAPIとの互換性を保
ちつつ、情報家電等の組込みシス
テムで共通に必要となる、 各種
機能を拡張しております。また、
開発に際してはOESFで選定した
ハードウェアプラットホームを
ターゲットとしています

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-92
Embedded Master 開発者サイト
AOSPと同様にEMにも開発者のためのサイト
(http://developer.oesf.biz/em/developer/)があります。
各バージョンのリリース情報やソースコードの取得方法、
ターゲットボードでの動作のさせ方など、詳しい開発情報が
得られます。

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-93
Embedded Master バージョン
バージョ
ン

コード

説明

5

Fig

TBD

4

EggPlant

Andrid 4.0がベース
詳細は近日にアナウンス予定

Durian

Andrid 2.2がベース
OPBのバージョンアップ、
グラフ・チャートAPI、OSGi拡張機能

2

Cinnamon

Andrid 2.0がベース
拡張ビルド環境(OESF Platform Builder:
OPB)
マーケットプレイスSDKの提供

1

Blue
Berry

3

シンボル

EMの初代バージョン。Android1.6がベース
高解像度スクリーンのサポート
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-94
EM3ソースコードの取得
Armadillo440用のカー
ネルコードの取得方法
の説明リンク
サポートしているカーネルの機能
Core: Android^(TM) 2.2_r1.3
wpa_supplicant(version 0.5.11)
OESF boot screen
Usb keyboard supported
ALSA sound supported
・ALSA-library(version
1.0.23)
・ALSA-Utility(version
1.0.23)

・ビルド環境のセットアッ
プ
(OBPを使用する場合はEclipseの
pluginであるCDTをインストールす
る必要があるが今回は使用しない)

・EM3 for ARMのソース
コードの取得方法
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-95

95
EM3ソースコードの取得
[host_pc~]
[host_pc~]
[host_pc~]
[host_pc~]
[host_pc~]

>
>
>
>
>

cd␣~work
mkdir␣v2_armadillo440-training
export␣ANDROID=~/work/v2_armadillo440-training
cd␣$ANDROID
git␣clone␣git://github.com/OESF/Embedded-Master-

ARM.git
:

Resolving deltas: 100% (136625/136625), done.
Checking out files: 100% (257515/257515), done.
:

[host_pc~] > cd␣Embedded-Master-ARM/
[host_pc~] > ls

core i5 メモリ
1.5G
ubuntu on vmware
90分くらい

Makefile build development frameworks linaro packages sdk
bionic
cts
device
hardware
ndk
pms
system
bootable dalvik external
kernel
opb
prebuilt vendor
タグで正確にEM3を取得するにはgit clone終了後以下を実行
[host_pc~] > cd␣Embedded-Master-ARM
[host_pc~] > git␣checkout␣-b␣EM3␣refs/tags/EmbeddedMaster-3.1.0
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-96

96
Androidのユーザランドのビルド

core i5 メモリ
1.5G
ubuntu on vmware
120分くらい

// Androidユーザランドのビルド
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/
[host_pc~] > echo␣"TARGET_PRODUCT:=armadillo440"␣>␣buildspec.mk
[host_pc~] > make␣-j2

2012年5月23日現在ビルドエラーが発生します。
packages/apps配下の下記フォルダを削除することでビルドエラーの発生を回避できま
OesfAndroidSystemMonitor
OesfNaviCoopAppCarIcon
OesfNaviCoopAppPoiDest
OesfNaviCoop_PluginNavi_CoopAppRoute
OesfSystemMonitorExample

OesfMonitorLogGraphicView
OesfNaviCoopAppDispArea
OesfNaviCoop_PluginNavi_CoopAppDisplay
OesfNaviCoop_PluginNavi_CoopAppStatus

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-97

97
実
習

ユーザランドのファイルシステム作成
カンペ⇒01_ユーザランドのファイルシステム作
成.txt

[host_pc~] > cd␣$ANDROID
[host_pc~] > mkdir␣-p␣android-root

・・・①

[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/out/target/product/armadillo440
[host_pc~] > cp␣-Rdpf␣root/*␣$ANDROID/android-root
・・・②
[host_pc~] > cp␣-Rdpf␣system/* $ANDROID/android-root/system/
・・・③
[host_pc~]
[host_pc~]
[host_pc~]
[host_pc~]
[host_pc~]

>
>
>
>
>

cd␣$ANDROID/android-root
sudo␣chown␣-R␣root.root␣.
・・・④
sudo␣chmod␣777␣-R␣system/usr/keychars
・・・⑤
sudo␣chmod␣777␣-R␣system/usr/keylayout
・・・⑤
sudo␣chmod␣777␣system/etc/dhcpcd/dhcpcd-run-hooks ・・・⑤

①v2_armadillo440-trainingフォルダ直下に「android-root」というフォルダを作成
②$ANDROID/Embedded-Master-ARM/out/target/product/armadillo440/root/以下のすべてのファイルや
フォルダを「android-root」フォルダにコピー
③$ANDROID/Embedded-Master-ARM/out/target/product/armadillo440/system/以下のすべてのファイル
やフォルダを「android-root/system」フォルダにコピー
④「android-root」フォルダにroot権限を付与
⑤system/usr/keychars、system/usr/keylayout(ハードキーのバインド設定ファイル類)と
system/etc/dhcpd//dhcpcd-run-hooksに実行権限を付与する

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-98

98
実
習

固定IPアドレスの設定について

Androidのネットワーク設定は移植先のターゲットボードのルートファイル
システムにあるハードウェア専用の起動スクリプトinit.<hardware名>.rc
で設定されている
Armadillo440の場合 → $ANDROID/androidroot/init.armadillo440.rc
:

on boot
コメントをはずす
setprop ro.sf.lcd_density 120
sudo gedit init.armadillo440.rc
setprop ro.radio.use-ppp no
setprop ro.radio.noril yes
setprop status.battery.state Slow#LAN
service lan-setup
setprop status.battery.level 5
setprop status.battery.level_raw /system/etc/init.armadillo440.sh
50
setprop status.battery.level_scale 9 oneshot
setprop net.eth0.dns1 8.8.8.8
setprop net.dns1 8.8.8.8
symlink /dev/snd/dsp /dev/eac
このシェルスクリ
chmod 0666 /dev/snd/dsp
write /sys/class/backlight/pwm-backlight/brightness
プトも確認(次
255

ページ)

#LAN
##service lan-setup /system/etc/init.armadillo440.sh
##
oneshot
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-99

99
実
習

固定IPアドレス設定
カンペ⇒02_固定IPアドレス設
定.txt

//Androidのネットワーク設定ファイルに固定IPアドレスを設定しておく
[host_pc~] > cd␣$ANDROID/android-root
[host_pc~] > cd␣system/etc
[host_pc~] > sudo␣gedit␣init.armadillo440.sh

gedit起動、編集
#!/system/bin/sh
netcfg eth0 up
netcfg eth0 dhcp

#!/system/bin/sh
ifconfig␣eth0␣192.168.1.11
保存してgedit終了

//実行権限をつける
[host_pc~] > sudo␣chmod␣a+x init.armadillo440.sh

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-100

100
実
習

Androidファイルシステムの完成
カンペ⇒03_ファイルシステムの完
成.txt

//Androidユーザランドのファイルシステムをアーカイブにする
[host_pc~] > cd␣$ANDROID/android-root
[host_pc~] > tar␣cvzf␣$ANDROID/rootfs_a_training.tar.gz .
[host_pc~] > cd␣$ANDROID
[host_pc~] > ls
[host_pc~] > rootfs_a_training.tar.gz␣android-root␣EmbeddedMaster-ARM

ユーザランドのファイルシステム

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-101

101
Androidのユーザランドの
ファイルシステム構成(/)
data

root
/

キャッシュ、追加パッケージなど格納ディレクト
(R/W)(空)
dev
デバイスファイル格納ディレクトリ(空)
proc
Linux設定ファイル格納ディレクトリ(空)
sys
システムファイル格納ディレクトリ(空)
sbin
adbd実行ファイル格納ディレクトリ
system
次頁参照
init
起動処理実行ファイル
init.armadillo440.rc
initが実行するターゲットボード固有
起動用シェルスクリプト
init.rc
initが実行するAndroid固有起動用シェルスクリプ
default.prop
Androidデフォルトプロパティ
init.goldfish.rc エミュレータ起動用シェルスクリプト
initlogo.rle
起動時のロゴの画像ファイル
(RGB888のRAW形式の画像 )
空のディレクトリはAndroid起動時にカーネルやinitによって自動作成されます
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-102

102
Androidのユーザランドの
ファイルシステム構成(/system/)
app

/system/

bin
etc
fonts
framework
lib
usr
xbin
build.prop

プリインストールのアプリケーション
ファイル(.apk)
各種一般的なLinuxコマンド
設定用シェルスクリプトなど
フォントファイル(.ttf)
javaのandroidのライブラリ(.jar)
ネイティブライブラリ(.so)
キー設定ファイルなど
root用のコマンドなど
Androidデフォルトプロパティ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-103

103
実
習

Androidカーネルの作成
カンペ⇒04_カーネルの作成.txt

[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440
[host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-MasterARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi␣armadillo400_android_defconfig ・・・①
[host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-MasterARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- ・・・②

//カーネルのイメージファイル作成
[host_pc~] > gzip␣-c␣arch/arm/boot/Image␣>␣linux_training.bin.gz
①カーネルのコンフィギュレーションファイル
(armadillo400_android_defconfig)に記載してある設
定を.configに適用
②arm-eabi-というクロスコンパイラでカーネルをコンパ
イル
③イメージファイルをgzipで圧縮

Androidのカーネルイメー
ジ

※①②は実習時間短縮のためすでに実行済みなのでオブ
ジェクトファイルなどはできています。
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-104

104
Linuxカーネルのコンパイルオプション設定

■Linuxカーネルのコンパイルオプション設定とは
①ある機能をコンパイル「する/しない」の設定
→カーネルのオプション設定項目は膨大
②機能をコンパイルする上でどんな形でコンパイルするかの設定
→機能を静的にカーネルのバイナリに組み込むか
→機能をモジュールとしてコンパイルするのか

■コンパイル設定方法
・GUI設定ツールを使用して設定を行う
→$make menuconfig
・設定用ファイルを用意してmakeコマンドで設定を行う
→$make <ターゲットのハード名>_<*>_defconfig

■設定内容はmenuconfig終了後「.config」ファイルに収めら
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-105

105
KconfigとMakefile
■Linuxカーネルのコンパイルオプション設定で設定できる
オプション名は「Kconfig」というファイルで設定されてい
ます
■ハードウェアのドライバのソースコードが収まっている
ディレクトリには必ず「Kconfig」と「Makefile」が存在し
ます
■新しいハードウェアを追加するたびにこのKconfigファイ
ルにオプション名を追加し、Makefileにはそのオプション
に関係のあるソースコード(オブジェクトファイル)の依
存関係の設定を行います
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-106

106
KconfigとMakefile
具体例を見てみましょう。
USBメモリの機能を追加するためのパラメータ(オプション名)とそれに関連するドライバ
のソースコードを探す方法です。
USBメモリはストレージ設備(USB Mass Storage)なのでdrivers/usb/storage/ディレク
トリ内のKconfigを見てみます。
config USB_STORAGE_DATAFAB
bool "Datafab Compact Flash Reader support (EXPERIMENTAL)"
depends on USB_STORAGE && EXPERIMENTAL
help
Support for certain Datafab CompactFlash readers.
Datafab has a web page at <http://www.datafabusa.com/>.

⇒Datafab社製の製品でコンパクトフラッシュリーダーに関連
する機器
config USB_STORAGE_SDDR55
bool "SanDisk SDDR-55 SmartMedia support
(EXPERIMENTAL)"
depends on USB_STORAGE && EXPERIMENTAL
help
Say Y here to include additional code to support
the
Sandisk SDDR-55
SmartMedia reader in the USB Mass Storage driver.
⇒SanDisk社製の製品でスマートメディアカードに関連する機

器

config USB_STORAGE ←USBメモリの機能のオプション
tristate "USB Mass Storage support"
名
depends on USB && SCSI
---help--Say Y here if you want to connect
USB mass storage devices to your
computer's USB port. This is the driver you
need for USB
floppy drives, USB hard disks, USB tape drives,
USB CD-ROMs,
USB flash devices, and memory sticks, along
with
similar devices. This driver may also be used
for
some cameras
and card readers.
This option depends on 'SCSI' support being
enabled,
but you probably also need 'SCSI device
support:
SCSI disk support'
(BLK_DEV_SD) for most USB storage devices.

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-107

To compile this driver as a module, choose M

107
KconfigとMakefile
次にMakefileを見てみます
# Makefile for the USB Mass Storage device drivers.
# 15 Aug 2000, Christoph Hellwig
# Rewritten to use lists instead of if-statements.
#
EXTRA_CFLAGS

:= -Idrivers/scsi

obj-$(CONFIG_USB_STORAGE)

+= usb-storage.o

usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG)
usb-storage-obj-$(CONFIG_USB_STORAGE_USBAT)
:
<省略>
usb-storage-obj-$(CONFIG_USB_STORAGE_KARMA)
usb-storage-objs :=

←このオプションに対するモジュール
+= debug.o
+= shuttle_usbat.o
+= karma.o

scsiglue.o protocol.o transport.o usb.o 
←scsiglue.c、protocol.c、
initializers.o $(usb-storage-obj-y)transport.c、usb.c、

ifneq ($(CONFIG_USB_LIBUSUAL),)
obj-$(CONFIG_USB)
+= libusual.o
endif

initializers.c及びこれらと
同名のヘッダファイルがモ
ジュールの実体
であることがわかります

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-108

108
「.config」ファイルについて
.config
#
# Automatically generated make config: don’t edit
# :
# :
CONFIG_64BIT=y
#CONFIG_X86_32 is not set
CONFIG_X86_64BIT=y
CONFIG_X86=y
・・・

値

意味

=y

この項目に対応する機能は静的にカーネルに組込まれる

=m

この項目に対応する機能は、モジュールとしてコンパイルされ
る。機能の中にはモジュールとしてコンパイルできないものが
ある。その場合対応する設定項目がこの値をとることはない。

# CONFIG_* is not set

この項目に対応する機能はコンパイルされない。コメントアウ
ト。

カーネルをビルドするとこのファイルの設定値でカーネルが作られる
.configを直接手で編集してはいけない
ある機能が他の機能に依存している可能性がある
機能の依存関係はKconfigが把握している
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-109

109
「.config」の新規作成

・「.config」がまだ存在しない場合
→$make menuconfig → <Exit>
→「.config」が生成
→Kconfigにおいてdefault指定された機能のみ
「.config」に適用

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-110

110
「.config」の更新
・「.config」がすでに存在する場合
→ソースツリーのルートに配置
→$make oldconfig
新しく追加された設定項目について1つ1つ設定するか確認さ

れる
(とりあえずすべてリターンでデフォルトを適用)

→「.config」が再生成
→$make menuconfigでカスタム設定→<Exit>
→「.config」更新

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-111

111
参
考

menuconfigの操作方法
↑

項目の選択カーソルを上に移動
項目の選択カーソルを下に移動

<TAB> 、← 、→

動作メニュー(
Select/Exit/Help)を切り替え

<Enter>

選択されている動作メニューに
応じて動作を行う

y

項目を<*>(有効:静的組込み)

n

項目を<>無効にする

m

項目を<M>(有効:モジュール
としてコンパイルする)

<SPACE>

<Exit>→
「新しい設定を保存するか?」
→
YES→.configに保存

動作

↓

[host_pc~] > make␣menuconfig

キー

項目を<M>/<*>/<>のトグルで切
り替える

<ESC><ESC>

上の階層に戻る(<Exit>と同じ
)

?

選択されている項目に関するヘ
ルプを表示(<Help>と同じ)

設定項目を検索する。設定項目
/
のシンボル名からメニュー上の
0-112
位置を探す場合に便利
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

112
アーキテクチャ毎の「.config」設定ファイル

・アーキテクチャ毎の「.config」の設定ファイルを
作成する
→$make defconfig
→アーキテクチャ毎のデフォルト設定に基づいた「.config」の設定ファ
イルが生成
→生成される場所

<linuxのソース>/arch/<arch>/configs/
<ターゲットのハード名
>_<*>_defconfig

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-113

113
実
習

armadillo400_android_defconfig

下記のファイルを開いて確認してみましょう
$ANDROID/Embedded-MasterARM/kernel/armadillo440/arch/arm/configs/armadillo400_android_defconfig

このファイルはカーネルのコンフィギュレーションの設定値(ターゲットボードの
ハードウェアおよびAndroidに特化した設定)が記載されたファイルです
makeコマンドでこのファイルを指定することによってカーネルオプションとし
て.configに反映されます

armadillo400_android_defconfigの一部抜粋
# Networking options
CONFIG_ANDROID_PARANOID_NETWORK=y
# Voltage and Current regulators
CONFIG_ANDROID_PMEM=y
# Android
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_LOGGER=y
# CONFIG_ANDROID_RAM_CONSOLE is not set
CONFIG_ANDROID_TIMED_OUTPUT=y
CONFIG_ANDROID_TIMED_GPIO=y
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-114

114
armadillo400_android_defconfig
# #MX25 Options
#
CONFIG_MACH_ARMADILLO420=y
CONFIG_MACH_ARMADILLO440=y
# #Armadillo-400 Board options
#
# CONFIG_ARMADILLO400_GPIO_A_B_GPIO is not set
CONFIG_ARMADILLO400_GPIO_A_B_I2C=y
# CONFIG_ARMADILLO400_GPIO_A_B_KEY is not set
CONFIG_ARMADILLO400_GPIO_C_D_GPIO=y
# CONFIG_ARMADILLO400_GPIO_C_D_I2C is not set
## Select wakeup source
#
CONFIG_ARMADILLO400_UART2_WAKE_SRC_SELECT=y
# CONFIG_ARMADILLO400_UART3_WAKE_SRC_SELECT is not set
# CONFIG_ARMADILLO400_UART5_WAKE_SRC_SELECT is not set
CONFIG_ARMADILLO400_TOUCHSCREEN_WAKE_SRC_SELECT=y
CONFIG_ARMADILLO400_TOUCHSCREEN_IS_WAKE_SRC=1
CONFIG_ARMADILLO400_GPIO_KEYS_WAKE_SRC_SELECT=y
CONFIG_ARMADILLO400_GPIO_KEYS_IS_WAKE_SRC=1
CONFIG_UTMI_MXC=y
# #Mapping drivers for chip access
#
CONFIG_MTD_ARMADILLO=y

# #Display device support
#
CONFIG_LOGO=y
CONFIG_LOGO_ARMADILLO_CLUT224=y
## System on Chip audio support
#
CONFIG_SND_SOC=y
CONFIG_SND_MXC_SOC=y
CONFIG_SND_MXC_SOC_SSI=y
CONFIG_SND_SOC_ARMADILLO440_WM8978=y

#NFS設定
## Miscellaneous filesystems
#
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-115

115
参
考

makeコマンド関連
[host_pc~] > make
カーネルのコンパイルをする。ソースツリーのルートディレクトリで実行。

[host_pc~] > make␣modules_install
コンパイルされたモジュールを/lib/modulesにインストール。

[host_pc~] > make␣install
カーネルバイナリイメージを/boot以下にインストールされる。
Fedora系ではブート時初期化ファイルシステムイメージも作成される。

[host_pc~] > update-initramfs␣–c␣–k␣<カーネルバージョン

>

Debian系においてブート時初期化ファイルシステムイメージも作成する際に使用するコマンド
ファイルまたはディレクトリ名

内容

/lib/modules/<カーネルバージョン>/

モジュールが配置されるディレクトリ

/boot/vmlinuz-<カーネルバージョン>

カーネルイメージファイル

/boot/initramfs-<カーネルバージョン> または
/boot/initrd.img-<カーネルバージョン>

ブート時初期化用ファイルシステムイメージ

/boot/Systemmap-<カーネルバージョン>

アドレス情報ファイル

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-116

116
参
考

mekeコマンド関連
[host_pc~] > make␣clean
ソースツリーをコンパイル前に戻す。オブジェクトファイルは削除される
が.configやコンパイル時に生成された一部ファイルは削除されない。

[host_pc~] > make␣help
使用可能なmakeターゲットを表示する。

[host_pc~] > make␣<dir>/<file>.o
指定したオブジェクトファイルを生成するのに必要なコンパイルだけを行う。
<dir>だけを指定した場合は、 .config によって生成されることになっている
そのディレクトリ内すべてのオブジェクトファイルが生成される。

[host_pc~] > make␣<dir>/<file>.ko
指定したモジュールだけを生成する

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-117

117
makeコマンド(クロスコンパイル)
クロスコンパイルに必要な変数

変数

意味

ARCH

ターゲットアーキテクチャ

CROSS_COMPILE

クロスコンパイラのプレフィックスを指定

[host_pc~] > make␣ARCH=arm CROSS_COMPLIE=armv5tel-linux-␣uImage
クロスコンパイラarmv5tel-linux-gccによってARM向けのカーネルをクロスコンパイルする。
生成するカーネルのバイナリイメージはuImage形式がよく使われる。
arch/arm/boot/uImageとして生成される。

[host_pc~] > make␣ARCH=arm CROSS_COMPLE=armv5tel-linux-␣modules
クロスコンパイラarmv5tel-linux-gccによってARM向けのカーネルモジュールをクロスコン
パイルで生成する。

[host_pc~] > make␣ARCH=arm CROSS_COMPLE=armv5tel-linux-␣

INSTALL_MOD_PATH=~/armroot-2.6.38␣modules_install
ホームディレクトリに~/armroot-2.6.38/lib/modulesというディレクトリが生成されその
下にクロスコンパイルで生成されたモジュールがインストールされる。
シンボリックリンク(build、source)->カーネルがコンパイルされたソースツリーをさす。
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-118

118
実
習

コンフィギュレーションの確認
makeコマンドやmake menuconfigでカーネルコンフィギュレーション値
が反映されたか確認する場合は

•方法1:「.config」をlessで確認(実習)
•方法2:make menuconfigコマンドでGUIから確認(参考)
// 方法1:カーネルの設定(.configへの適用)を確認する
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440
[host_pc~] > less␣config
lessで開いて検索( 「/」キーのあとにキーワードを入れてリターン)し設定が反映され
ているかを確認する
# Voltage and Current regulators
CONFIG_ANDROID_PMEM=y
#Android
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_LOGGER=y
など
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-119

119
参
考

コンフィギュレーションの確認
//方法2:make menuconfigコマンドでGUIから確認
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/
[host_pc~] > make menuconfig

Androidに特化したカーネルオプションの確認

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-120

120
参
考

コンフィグレーションの確認
NFS設定を行った場合の確認

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-121

121
メモ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-122

122
Armadillo440
製品版Linuxイメージファイル
アットマークテクノのサイトから出荷時状態のLinuxカーネル、ユーザランド、ダウン
ローダー「Hermit-at」をダウンロードする
http://armadillo.atmark-techno.com/armadillo-440/downloads
「Hermit-at」はAndroidをArmadillo440の移植する際に使用するので開発PCにインス
トールする
Linuxカーネルやユーザランドも必要なので必ず開発PCにダウンロードして保存しておく

【Hermit-at】

hermit-at_2.1.0_i386.deb
ダブルクリックしてインストールすること

【製品版Linuxカーネ
ル】
linux-a400-1.06.bin.gz
【製品版Linuxユーザラン
ド】
0-123
romfs-a440-1.04.img.gz
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

123
実習の開発環境まとめ
開発用PC
【実習用のAndroidソースコードのrootパス】

/home/aj741327/work/v2_armadillo440-training/Embedded-Master-ARM
【Android用Linuxカーネルのソースコードのrootパス】

/home/aj741327/work/v2_armadillo440-training/EmbeddedMasterARM/kernel
【環境変数】
[host_pc~]

> export␣ANDROID=/home/aj741327/work/v2_armadillo440-

training
Android
kernelイメージ

$ANDROID/Embedded-MasterARM/kernel/armadillo440/linux_training.bin.gz

Androidユーザラン
ドのファイルシステ $ANDROID/rootfs_a_training.tar.gz
ム

Armadillo440製品版Linux
kernelイメージ

~/work/atmark/linux-a400-1.06.bin.gz

ユーザランドイメー
ジ

~/work/atmark/romfs-a440-1.04.img.gz

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-124

124
ダウンローダ:Hermitについて
開発用PCにRS232Cの端子がない場合はUSB-RS232C変換ケーブ
ルを使用してUSBで接続してください

開発用PC

hermit
Armadillo用
ブートローダ兼ダウンロー
ダ

# 開発PCからイメージファイルをArmadilloにダウンロードするダウンローダとして使用す
る
# (例)atmarktechno製のLinuxカーネルイメージをarmadilloのフラッシュメモリに書き
込む
[host_pc~] > cd␣~/work/atmark
[host_pc~] > hermit␣download␣--input-file␣linux-a400-1.06.bin.gz␣--region␣kernel␣--

port␣ /dev/ttyUSB0
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-125

125
ブートローダ:Hermitについて
開発用PCにRS232Cの端子がない場合はUSB-RS232C変換
ケーブルを使用してUSBで接続してください
JP2ショート状態
(hermit起動モー
ド)

開発用PC
【C-Kermitの使い方】
*ホームディレクトリで起動させる
こと

Armadillo440
hermit
Armadillo用
ブートローダ兼ダウンロー
ダ

C-Kermit
シリアル通信ソ
フト

起動
接続
ヘルプ
切断
c
終了

# シリアル通信ソフトを介してarmadilloのブートローダーに接続する

kermit
c
?
ctrl +  ctrl +
q

[host_pc~] > kermit
← C-Kermit起動
Executing /home/aj741327/.mykermrc...
?SET SPEED has no effect without prior SET LINE
C-Kermit 8.0.211, 10 Apr 2004, for Linux
Copyright (C) 1985, 2004,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/aj741327/) C-Kermit>c
← ターゲット(armadillo-440)にシ

リアル接続
[armadillo] hermit>

ンプトが表示(接続済み) This material is licensed under the Creative Commons License BY-NC-SA 4.0.

← armadilloのhermitプロ
0-126

126
Armadillo440でAndroidを起動する手順

①
②
③
④
⑤
⑥
⑦

製品版Linuxで起動
Armadillo440側のネットワークの設定
microSDのパーティションと初期化
Android RootfsをArmadillo-440へ転送
Android RootfsをmicroSDに展開
AndroidのLinuxカーネルのメモリ書き込み
Android起動

0-127

This material is licensed under the Creative Open Embedded Software Foundation, All rights reserved
Copyright 2009-2012, Commons License BY-NC-SA 4.0.

127
製品版Linuxで起動してみよう
JP2をショート

C-Kermit
シリアル通信ソフ
ト
カンペ⇒05_製品版Linuxのブート手
順.txt

1.JP2をショートにする
2.シリアルケーブルでPCとArmadillo-440を接続する
3.LANケーブルでPCとArmadillo-440を接続する
4.Micro SDカード(1G以上)をスロットに挿入して電源を入
れる
5.C-Kermit起動(前頁参照)
6.Armadillo440の起動

microSD

実
習

hermit> clearenv //起動パラメータをク
リア

1G以上のmicroSD

hermit> boot //起動コマンド

Armadillo-440は出荷時状態です
Armadillo440用の標準カーネル
と標準ユーザランドが載っていま
す

・・・・起動ログが流れます
login : root //ログイン名入力
password : root //パスワード入力
[root@armadillo440-0 (ttymxc1) ~]# //起動

完了

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-128

128
実
習

Armadillo440側のネットワークの設定
作業PC側のネットワーク設定
ip:192.168.1.10
subnet:255.255.255.0

カンペ⇒06_製品版Linuxのネットワーク設
定.txt

192.168.1.10

[armadillo ~] # vi␣/etc/config/interfaces
#␣/etc/network/interfaces␣--␣configuration␣file␣for␣ifup(8),␣ifdown(8)
auto␣lo␣eth0
iface␣lo␣inet␣loopback
iface␣eth0␣inet␣static
address␣192.168.1.11
netmask␣255.255.255.0
network␣192.168.1.0
broadcast␣192.168.1.255
gateway␣192.168.1.1

viで編集

192.168.1.11

[armadillo
[armadillo
[armadillo
[armadillo
[armadillo

~]
~]
~]
~]
~]

#
#
#
#
#

cd␣/etc/config
flatfsd␣–s //コンフィギュレーション領域に保存
ifdown␣eth0
ifup␣eth0
ifconfig //確認

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-129

129
実
習

microSDのパーティションと初期化
パーティションのイメージ
mmcblk0p1
FAT 1-100M
mmcblk0p2

microSD

4G

ext3
残り全部の容量

[armadillo ~] # fdisk␣/dev/mmcblk0
The number of cylinders for this disk is set to 30656.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): d //削除コマンド
Selected partition 1 //パーティション1を指定(不要なパーティションが残っていた

場合念のため削除)
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-130

130
実
習

microSDのパーティションと初期化
Command (m for help): n //新規パーティション追加コマンド
Command action
e
extended
p
primary partition (1-4)
p //パーティション
Partition number (1-4): 1 //パーティション1を選択
First cylinder (1-30656, default 1): リターン(default 1) //シリンダの開始値
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-30656, default 30656): +100M //シ

リンダの終了値
Command (m for help): n //新規パーティション追加コマンド
Command action
e
extended
p
primary partition (1-4)
p //パーティション
Partition number (1-4): 2 //パーティション2を選択

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-131

131
実
習

microSDのパーティションと初期化

First cylinder (3054-30656, default 3054):リターン(default 3054 ) //シリンダの開

始値
Using default value 3054
Last cylinder or +size or +sizeM or +sizeK (3054-30656, default 30656): ):

リターン(default 30656 ) //シリンダの終了値
Using default value 30656
Command (m for help): w //パーティション作成実行して終了
The partition table has been altered!
Calling ioctl() to re-read partition table.
mmcblk0: p1 p2
mmcblk0: p1 p2
Syncing disks.
[armadillo ~] # mkdosfs␣/dev/mmcblk0p1

↑パーティション1(データ保存領域) はWindowsとのデータ交換を考え
てDOS用
ファイルシステムFATでフォーマット
[armadillo ~] # mke2fs␣-j␣/dev/mmcblk0p2

↑パーティション2(Android ユーザーランド領域) はEXT3 でフォー
マット

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-132

132
実
習

Android RootfsをArmadillo-440へ転送
開発PC

armadillo440

/home/ftp/pub/

FTP

rootfs_a_training.tar.gz

192.168.1.11
カンペ⇒07_Android RootFSのFTP転送.txt

192.168.1.10

$ANDROIDの有効化
[host_pc~] > export ANDROID=~/work/v2_armadillo440-train

[host_pc~] > cd␣$ANDROID
[host_pc~] > ftp␣192.168.1.11
login name:ftp
login password:なし
ftp> cd␣pub
ftp> bin
ftp> put␣rootfs_a_training.tar.gz
ftp> bye
[host_pc~] >
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-133

133
実
習

Android RootfsをmicroSDに展開
Armadillo440の/home/ftp/pubからAndroidのユーザラ
ンドのファイルシステムをmicroSDカードのパーティ
ション2(mmcblk0p2)に展開します
カンペ⇒08_Android RootFSをmicroSDに展開.txt

[armadillo ~] # mount␣/dev/mmcblk0p2 /mnt

//microSDのパーティション2

にマウント
[armadillo ~] # cd␣/home/ftp/pub
のある場所へ
[armadillo ~] # mv␣rootfs_a_training.tar.gz␣/mnt/.

//ftpで転送したRootfs
//マウント配下にRootfsを

移動
//マウントディレ

[armadillo ~] # cd␣/mnt

クトリへ
[armadillo ~] # tar␣xzvf rootfs_a_training.tar.gz
[armadillo ~] # rm␣–rf␣lost+found
[armadillo ~] # rm␣–rf rootfs_a_training.tar.gz
[armadillo ~] # cd␣..

// Rootfsを展開
//不要なフォルダの削除
//tarファイルも削除
//マウント

ディレクトリから抜ける
[armadillo ~] # umount␣/mnt
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

//アンマウント
0-134

134
実
習

製品版Linuxのrebootとkermit切断
[armadillo ~] # reboot
[armadillo ~] #
System is going down for system reboot now.

Starting local stop scripts.
Exiting Syslogd!
Syncing all filesystems:
done
Unmounting all filesystems:
done
The system is going down NOW !!
Sending SIGTERM to all processes.
Please stand by while rebooting the system.
Hermit-At v2.0.8 (armadillo4x0) compiled at 15:29:17, Nov 12 2010
hermit> <ctrl+→ctrl+c> //ショートカットキー
(Back at ubuntu-vm)
---------------------------------------------------(/home/aj741327/) C-Kermit>q
Closing /dev/ttyUSB0...OK
[host_pc~] >

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-135

135
実
習

AndroidのLinuxカーネルをフラッシュROMに書き込む

Armadollo-440
開発用PC

hermit
Armadillo用
ブートローダ兼ダウンローダ

Androidのユーザランドの
ルートファイルシステム
が入っています

Armadillo440用の標準カーネル
をAndroidのLinuxカーネルで上書きしま
す

カンペ⇒09_Androidブート手順.txt

# Armadillo440用の標準カーネルをAndroidのLinuxカーネルで上書きします
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440
[host_pc~] > hermit␣download␣--input-file␣linux_training.bin.gz␣--region␣kernel␣

--port␣/dev/ttyUSB0
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-136

136
実
習

Androidを起動しましょう
[host_pc~] > cd
[host_pc~] > kermit

C-Kermit起動 &
接続

C-Kermit> c

Armadilloにシリアル

hemit> setenv␣console=ttymxc1␣root=/dev/mmcblk0p2␣init=/init␣noinitrd␣rootwait
hermit> setenv

カーネル起動パラメータ設定
確認

1: console=ttymxc1

&

2: root=/dev/mmcblk0p2
3: init=/init
4: noinitrd
5: rootwait

hermit> boot

起動

Uncompressing
カーネルスター
kernel....................................................................................................
ト
........done.
Doing console=ttymxc1
Doing root=/dev/mmcblk0p2

Linuxカーネルのバージョン

Doing init=/init

ARMのアーキテクチャ

Doing noinitrd
Doing rootwait
Linux version 2.6.26-at7 (unknown) (aj741327@ubuntu-vm) (gcc version 4.4.0 (GCC) ) #1 PREEMPT Tue Feb 15
14:50:35 JST 2011
0-137
CPU: ARM926EJ-S [41069264] revision 4 (ARMv5TEJ), cr=00053177
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

137
Android起動ログ
Machine: Armadillo-440
Memory policy: ECC disabled, Data cache writeivity 4, 32 byte lines, 128 sets
CPU0: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
Built 1 zonelists in Zone order, mobility grouping on.

Total pages: 32512

カーネル起動パラメー
Kernel command line: console=ttymxc1 root=/dev/mmcblk0p2 init=/init noinitrd rootwait
タ

MXC IRQ initialized
PID hash table entries: 512 (order: 9, 2048 bytes)
MXC GPT timer initialized, rate = 12000000
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 128MB = 128MB total
Memory: 125912KB available (3200K code, 683K data, 112K init)

カーネル初期化

Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 480 bytes
NET: Registered protocol family 16
MXC WDOG1 Enabled
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-138

138
Android起動ログ
CPU is i.MX25 Revision 1.0
Clock input source is 24000000
MXC GPIO hardware
Using SDMA I.API

MXC DMA API initialized
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
MXC I2C driver

カーネル初期化

MXC I2C driver
MC34704 regulator successfully probed
mc34704 0-0054: Loaded
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
fsl-ehci fsl-ehci.1: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci.1: new USB bus registered, assigned bus number 2
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-139

139
Android起動ログ
fsl-ehci fsl-ehci.1: irq 37, io mem 0x53ff4000
fsl-ehci fsl-ehci.1: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found

hub 2-0:1.0: 1 port detected
asoc: WM8978 HiFi <-> imx-i2s-1 mapping ok
ALSA device list:
#0: armadillo440 (WM8978)
ip_tables: (C) 2000-2006 Netfilter Core Team

カーネル初期化

TCP cubic registered
NET: Registered protocol family 17
NET: Registered protocol family 15
Static Power Management for Freescale i.MX25
input: imx_adc_ts as /devices/virtual/input/input1
i.MX ADC input touchscreen loaded.
rtc-s353xxa 2-0030: setting system clock to 2000-01-01 22:04:59 UTC (946764299)

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-140

140
Android起動完了!
Waiting for root device /dev/mmcblk0p2...
mmc0: new high speed SD card at address b368
mmcblk0: mmc0:b368 SD02G 1968128KiB
mmcblk0: p1 p2

カーネル起動設定パラメータに従ってrootディレクトリを
マウント

VFS: Mounted root (ext2 filesystem).
Freeing init memory: 112K
Warning: unable to open an initial console.
sh: can't access tty; job control turned off

rootディレクトリ直下にあるinitを
起動
→initの詳細は後述

# warning: `rild' uses 32-bit capabilities (legacy support in use)

初回起動時は内部の
データベース構築10分ほど
時間がかかりますのであせらず
待ちましょう

fec: PHY @ 0x0, ID 0x0007c0f1 -- LAN8720
eth0: link down
eth0: link up, 100Mbps, full-duplex
imx ssi is already activated

request_suspend_state: wakeup (3->0) at 117437937832 (2000-01-01 22:06:54.852144332 UTC)
binder: release 141:141 transaction 1721 out, still active
binder: 52:185 transaction failed 29189, size 4-0
binder: send failed reply for transaction 1721, target dead
#

起動完了!(Androidのshellプロン
プト)
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-141

141
実
習

Android起動後の確認
# cd /
# ls
lost+found
etc
d
mnt
acct
data
default.prop
dev
init
init.armadillo440.rc
init.goldfish.rc
init.rc
initlogo.rle
proc
sbin
sys
system
sdcard
cache
config
# netcfg
lo
UP
eth0
UP
#

rootディレクトリに
移動

ルートのディレクトリ構成
→2章のAndroidのルートファイルシステム
参照

127.0.0.1
255.0.0.0
192.168.1.11

0x00000049
255.255.255..

ネットワークの確
0x00001043
認

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-142

142
メモ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-143

143
起動後のデバッグ
シリアルコンソールからLogcat実行でシステムログやカスタムログの監視がで
きますが
この場合、シリアルポートをLogcatが占有してしまい終了できなくなってしま
います
よってシリアルポート接続のプロセスを一度KILLしないとカーネルメッセージ
ログの
確認ができません
実際は

シリアルポートはカーネルメッセージを確認するのみに使
# logcat
用し、
シリアルポートが1ポートしかないので
D/dalvikvm( 46): GC_EXPLICIT freed 2181 objects / 110568 bytes in 191ms
カーネルログがみることができなくなってし
Logcatなどのデバッグ機能はネットワーク経由でADB接続し
W/InputManagerService( 46): Starting input on non-focusedまう
client
com.android.internal.view.IInputMethodClient$Stub$Proxy@43db5738 (uid=10019 pid=247)
てDDMSなどを用いて行う
W/InputManagerService( 46): Client not active, ignoring focus gain of:
com.android.internal.view.IInputMethodClient$Stub$Proxy@43d57238

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-144

144
ADBデバッグ
ADB (Android Debug Bridge)やDDMS (Dalvik Debug Monitor
Server )を使用すればグラフィカルなログ表示や開発用PCの
シェルからデバッグ、アプリケーションのインストール・ア
ンインストールなどが可能になります
シリアルではなく
ネットワーク経由

DDMS

コマンド類

she
ll

goldfish
(エミュレー
タ)

Android SDK

ADT on
Eclipse

adbd

ターゲットボード
dalvikVM

開発用PC

adbd

adbサーバ

DDMS
グラフィカ
ル
ツール

shell

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-145

145
ADBデバッグをするために
Android SDK

1. ADBデバッグツールはAndroid
SDKのtoolsに含まれている
⇒ホストPCにAndroid SDKを
インストールする必要が
ある

開発用PC
192.168.1.10

192.168.1.11

2. ターゲットボードのadbdと開
発用PCのadbサーバの通信はリ
モート接続が必要
⇒Armadillo440で動作して
いるAndroidに固定IPアド
レス
を設定する必要がある
⇒環境変数ADBHOSTにター
ゲットボードのIPアドレ
0-146
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

146
Android SDKのインストール
*proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で
きません

ダウンロードサイト(Android Developers >
SDK)
http://developer.android.com/intl/ja/sdk/in
dex.html

tgz形式のアーカイブをダウンロードし
て ダウンロードしたtgzファイルを任
意の場所で展開

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-147

147
Android SDKのインストール
*proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で
きません

SDKのtgzファイル展開後以下の実行ファイルを実行
SDKのルート/android-sdk-linux/tools/android

「Packages 」
→以下の2つにチェックを入れる
・「Android SDK Pratform-tools」と
・「Android 2.2(API 8)-> SDK Platform」
→「Install 2Packages」

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-148

148
Android SDKのインストール
*proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で
きません

「Acsept all 」→「Install」

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-149

149
Android SDKのインストール
*proxy環境ではAndroid SDK and AVD Managerからダウンロードサイトに接続で
きません

ダウンロードが完了するとSDKのルート/androidsdk-linux/ 配下の「platform-tools」ディレク
トリと「platform」ディレクトリ内に「android8」ディレクトリができていることを確認
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-150

150
実
習

adb起動
カンペ⇒10_adb起動.txt

開発PCのホーム直下にある~/.bashrcに以下を追加してあるか確認
export␣PATH=${PATH}:~/android/android-sdk-linux/platform-tools
export␣PATH=${PATH}:~/android/android-sdk-linux/tools
export␣ADBHOST=192.168.1.11 ←ターゲットボードのIPアドレス

開発PCのシェルからadbサーバ起動
[host_pc~] > adb␣kill-server ← adbサーバ停止コマンド
[host_pc~] > adb␣start-server ← adbサーバ起動コマンド
* daemon not running. starting it now on port 5037 * ← 開発PCの5037

ポート使用
* daemon started successfully *
[host_pc~] > adb␣devices
List of devices attached
emulator-5554
device ← ADBで接続できたらデバイスリストに表示される
[host_pc~] >

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-151

151
実
習

ddms起動
開発PCのシェルにてddms実行
[host_pc~] > ddms

プロセス一覧

スレッド一覧
ヒープメモリのプロファイル
アロケーショントラッカー など
ログの保存

Logcat・・・DalvikVMやシステムのログ

ddms→「Device」→「Screen
capchar」
でターゲットボードの画面キャプチャ
0-152
が撮れます
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

152
adbでできる事
ホストPCシェルのadbコマンド一覧(一部抜粋)
$ adb shell

Android OSにログインしてシェルを起動
次頁参照

$ adb installアプリケーシ

adb経由でアプリケーションをインストール
ex) $ adb install HelloWorld.apk

ョン名
$ adb uninstallアプリケー

ションのパッケージ名
$ adb push ホストPCのロー

カルファイル名 コピー先の
パス
$ adb pull デバイスのファ

adb経由でアプリケーションをアンインストール
ex) $ adb uninstall
com.adakoda.android.helloworld
ホストPCのローカルファイルをエミュレータ/デ
バイスの指定の場所にコピー
ex) $ adb push sample.png /sdcard/

イルのパス コピー先のホス
トPCのパス

エミュレータ/デバイスのファイルをホストPCに
コピー
ex) $ adb pull /sdcard/sample.png /tmp

$ adb logcat

Logcatを起動してログをみる
This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-153

153
adbでできる事
adb shellで実行できるコマンド(一部抜粋)
# dalvikvm -showversion

Javaの実行環境のバージョン確認

# netcfg

ネットワーク状態の確認

# netcfg eth0 dhcp

eth0のネットワークアドレスをdhcpで取得する

# netcfg eth0 (up) /
(down)

up : eth0を有効にする / down : eth0を無効にする

# netstat

ホストのネットワーク接続状態やソケット/インターフェイスごとのネットワーク
統計参照

# sqlite3 DB名

Androidの中のsqlite3(データベース)の操作
ex) sample.dbにitemsテーブルを作成
# sqlite3 /data/data/sample.app/databases/sample.db
:
sqlite> create table items (id integer primary key
autoincrement, s text not nul
);
create table items (id integer primary key autoincrement, s text
not null);
sqlite>.exit
.exit
#

# ifconfig eth0 IPアドレ
ス
# vmstat
# reboot

eth0に固定IPアドレスを割り当てる
コマンド一覧は/system/bin 配下を参照のこと
現在のプロセス,メモリー,スワップ,デバイス,割り込み,CPUの情報参照
0-154
This material is licensed under the Creative Commons License BY-NC-SA 4.0.
154
デバイスを再起動する
まとめと次回予告
3章では実習で使用するターゲットボードの仕様やメモリ使用
方法
について学び、4章ではEM3がArmadillo440で起動して
デバッグができる環境が完成しました
次章からはAndroid搭載のターゲットボードにデバイスの組込
み、
それが動作するアプリケーションの作成方法について学びます

シリアルインタフェースのデバイス

Bluetoothアダプタ

USBシリアル変換ケーブル

WiFiアダプタ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-155

155
メモ

This material is licensed under the Creative Commons License BY-NC-SA 4.0.

0-156

156
マスタ タイトルの書式設定
第5章 デバイスの組み込み

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-157

157
5章の概要
•
•
•
•
•
•
•
•
•
•

Linuxにおけるデバイス入出力
デバイスドライバの種類
デバイスドライバの作成方法
カーネルにデバイスドライバを組み込む
Linuxのデバイスファイル
デバイス専用ライブラリ
Androidにおけるデバイス入出力
Androidにデバイスドライバを組み込む
Androidのデバイスファイル
Android2.3でのデバイス関連の扱い

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-158

158
Linuxにおけるデバイス入出力
デバイスとやり取りするために必要なもの
デバイスドライバ
最初からカーネルイメージに組み込んでしまう
カーネル起動後にモジュールをロードして組み込む

マスタ タイトルの書式設定
デバイスファイル(/dev/xxx)

デバイスを仮想化し、デバイスファイルへの入出力が実際のハー
ドウェアの入出力になる
udevdが自動生成してくれる

デバイスファイルを制御するライブラリ
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-159

159
Linuxにおけるデバイス入出力
アプリケーション

アプリケーショ
ン

デバイス制御用
ライブラリ

デバイス制御用
ライブラリ

デバイス制御用
ライブラリ

マスタ タイトルの書式設定
/dev/yyy

デバイスファイル /dev/xxx
モジュール
(hoge.ko)

insmod
modprobe

/dev/zzz

Linuxカーネル
デバイスドライ
バ
(組み込み)

デバイスドライ
バ
(モジュール)

WiFiアダプタ

デバイスドライ
バ
(組み込み)

Bluetoothアダプタ
USBシリアル変換ケーブル

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-160

160
デバイスドライバの種類
キーボードやシリアルケーブルなど

キャラクタデバイ
システムが1文字(1byte)ずつデー
ス
タを転送する機器

すでにメーカー
で用意されてい
る
自作でもなんと
か作れる

ハードディスクやCDなどのように順
序に関係なくランダムアクセス可能
なストレージのようなもの

すでにメーカー
で用意されてい
る
公開されていな
い場合、自分で
実装するのは困
難

ネットワークデバ インターネット接続のためなど、
ネットワーク接続を行うためのもの
イス

すでにメーカー
で用意されてい
る
公開されていな
い場合、自分で
実装するのは困
難

マスタ タイトルの書式設定
ブロックデバイス

その他のデバイス

デバイスがGPIO(General Purpose
Input/Output:汎用入出力)を介して Commons
This material is licensed under the Creative
License BY-NC-SA 4.0.
カーネル情報にProcFSで直接アクセ

ProcFSでのアク
セスは複雑なデ
バイスでは機能
5-161
不十分のため

161
参
考

デバイスドライバを1から自作
アプリケーショ
ン
デバイス制御用
ライブラリ

例)GPIOを使用したデバイスのドライバ
GPIO(General Purpose Input/Output)とは・・・
マイクロプロセッサやマイコン、インタフェースデバイスに存在する汎
用入出力
で信号の種類や用途は開発者が自由に決めて使うことができる入出力ピ
ン

/dev/zzz

マスタ タイトルの書式設定

Linuxカーネル
デバイスドライ
バ

キャラクタデバイスとしてドライバを作
成
■デバイス制御開始・終了
open/close・・・入出力準備、クローズ処理

GPIOピン

■デバイス制御に用いる関数
LEDやボタン
デバイス

ioctl・・・ハードウェアの入出力(GPIOピンの電圧の
制御)をプログラムから使いやすい形にする

■デバイス入出力関数

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-162

162
参
考

デバイスドライバのコード

例 )GPIOを使用してデバイスのLEDの点灯・消灯を行う
GPIOを使用してデバイスのボタンのON・OFFの状態を
①mknodeコマンドでノード(デバイス用スペシャルファイル)を作成する
②kernel/drivers/misc/sample_gpio_char.c を作成する

マスタ タイトルの書式設定

最小限に必要なヘッダ
include linux/module.h // MODULE macro, THIS_MODULE
include linux/kernel.h //printk
include linux/proc_fs.h // alloc_chrdev_region
include asm/uacsess.h // copy_from_user, copy_to_user
include asm/io.h
// inb,outb
include linux/cdev.h
//cdev_init
include “sample_gpio.h” //GPIOレジスタやLED制御用構造体の定義などのヘッダ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-163

163
参
考

デバイスドライバのコード
カーネル起動時、またはinsmodされたときに呼び出されるinit関数
module_init ( “sample_gpio_char_init” );
static int __init sample_gpio_char_init(void) {
//キャラクタデバイスのMAJOR番号の割り当てと登録 (register_chrdev)
//キャラクタデバイス構造体と処理関数の登録
//キャラクタデバイスの初期化
}

マスタ タイトルの書式設定

カーネル停止時、またはrmmodされたときに呼び出されるexit関数
module_exit ( “sample_gpio_char_exit” );
static int __exit sample_gpio_char_exit(void) {
//キャラクタデバイスを削除(unregister_chrdev)
}

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-164

164
参
考

デバイスドライバのコード
カーネルにデバイスドライバについての情報を伝える
MODULE_DESCRIPTION ( “sample_gpio_char” );
MODULE_LICENSE ( “GPL2” );

read関数とwrite関数、ioctl関数

マスタ タイトルの書式設定

//コマンド(cmd)と構造体のポインタ(inode)を受け取る
static int sample_gpio_char_ioctl ( struct inode *inode, unsighed int cmd, unsighed long arg) {
// LEDのON/OFF設定を処理
// ユーザボタンの値を取得するコマンドの処理
// キャラクタデバイス構造体の登録
}
static ssize_t sample_gpio_char_read ( struct file* filp, char* buf, size_t count, loff_t* offset) {
//sample_gpio_char_ioctlから現状のボタンの値を読み出して返す
}
static ssize_t sample_gpio_char_write ( struct file* filp, const char* buf, size_t count, loff_t*
offset) {
//led 0/1 on/offの値をsample_gpio_char_ioctl に渡す
}
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-165

165
参
考

KconfigとMakefileの設定
例 )

kernel/drivers/misc/Kconfig

config SAMPLE_GPIO_CHAR
bool “Sample GPIO CHAR for LED and User Button”
default n
---help--if you use GPIO for LED and User Button

マスタ タイトルの書式設定

例 )

kernel/drivers/misc/Makefile

obj-$(CONFIG_SAMPLE_GPIO_CHAR)
+=sample_gpio_char.o

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-166

166
参
考

ドライバの組込み/モジュール生成
前頁の例で作ったドライバをカーネルに組み込む
$ make menuconfig //設定GUI起動
# DeviceDrivers -> Misc Devices
#
-> [*]Sample GPIO CHAR for LED and User
Button
$ make

マスタ タイトルの書式設定

前頁の例で作ったドライバをモジュール(sample_gpio_char.ko)
にする
$ make menuconfig //設定GUI起動
#DeviceDrivers -> Misc Devices
#
-> [M]Sample GPIO CHAR for LED and User
Button
$ make modules
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-167

167
デバイスドライバ(実務では?)
アプリケーショ
ン
デバイス制御用
ライブラリ

ハードベンダ以外の組み込み系デバ
ドラ開発者がやること
・電圧や消費電力の制御
・デバイスの起動時間やアプリケーショ
ンの
起動時間のチューニングなどを盛り込
んだ
実装をもとのデバイスドライバにラッ
ピング
して一つのドライバとしてカーネルに
ハードベンダが提供
組み込む

マスタ タイトルの書式設定
/dev/zzz

Linuxカーネル

デバイスドライ
バ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-168

168
カーネルバージョンとドライバ
デバイスドライバは、カーネルに依存している
たとえ同じ名前のドライバであっても作成された(ビルド
された)カーネルソースが変われば、まったくの別物
サードベンダーが提供するドライバファイルは使用してい
るカーネルバージョンと合わない場合には、使用不可

マスタ タイトルの書式設定

カーネルバージョンが合わないデバイスドライバを組み込もう
とするとどうなるのか?
insmodによるロード時にバージョンの整合性検査があるの
で組み込めない(エラーになる)
“modprobe -f”のオプションをつけてモジュールを強制的
にロードすればうまくいく可能性があるが動作保障はな
い
(Androidではmodprobeコマンドは使用できない)
同じバージョンのカーネルでコンパイルし直す必要あり
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-169

169
モジュール関連コマンド
lsmod
現在ロードされているモジュールの一覧表示
Module : ロードされているカーネル・モジュール名
Size
: カーネル・モジュールのサイズ
Used by: 使用カウント数、参照しているモジュールの一覧
--------------------------------------------------------# lsmod
Module
Size
Used by
i915
81412
3
md5
3968
1
ipv6
232768
12
i2c_dev
11392
0
i2c_core 22400
1
----------------------------------------------------------

マスタ タイトルの書式設定

modprobe

モジュールのロード、 modules.depファイルを参照して依存関
係を考慮
insmod
モジュールのロード(依存関係は考慮しない)
rmmod
モジュールのアンロード
-r オプション : 依存するモジュールも同時に削除
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-170

170
モジュール関連コマンド
modinfo

:モジュールの情報参照

---------------------------------------------------------# modinfo vsock.ko
filename:
vsock.ko
supported:
external
license:
GPL v2
version:
1.0.0.0
description:
VMware Virtual Socket Family
author:
VMware, Inc.
srcversion:
3411024EE424348B0A16460
depends:
vmci
vermagic:
2.6.27-11-server SMP mod_unload modversions 686
------------------------------------------------------------

マスタ タイトルの書式設定

このモジュールが作成された環境のカーネルバージョ
ン

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-171

171
Linuxのデバイスファイル
Kernel2.6以降ではudevdというデーモンがデバ
イスの追加削除の通知をカーネルから受けて
デバイスファイルを自動で作成削除する
/etc/udev/rules.d/xxyyy.rules

マスタ タイトルの書式設定
デバイスの
ベンダID
などの情報

NETLINK Socket
プロセス間通信

Linuxカーネル

通知

udevd
作成/削除

挿抜

/dev/zzz
汎用デバイスのデバイスファイル
名はドライバのソースで定義され
ている
5-172
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

172
デバイス専用ライブラリ
アプリケーショ
ン
デバイス制御用
ライブラリ

デバイスファイル「/dev/zzz」に
対する制御を行うライブラリ

fcntl.hのopen関数、close関数、
マスタ タイトルの書式設定
read関数、write関数などを使う
/dev/zzz

Linuxカーネル
デバイスドライ
バ

GPIOピン

アプリケーションからLEDの点灯・消
灯のコマンドをデバイスファイルに
書き込む制御
ボタンの状態をデバイスファイルから
読み出してアプリケーションで表示

LEDやボタン
デバイス
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-173

173
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-174

174
Androidにおけるデバイス入出力
Linuxのデバイス入出力の仕組みとほぼ同じ
【相違点】
デバイスドライバ
カーネル起動後にモジュールをロードさせる場合はinit.rc
(init.[ハードウェア名].rc)に指定

マスタ タイトルの書式設定
デバイスファイル(/dev/xxx)

udevdが存在しない
デバイス情報はカーネルからソケットとしてinitで監視中のdevice_fd
で
受け取る
ソケットにはsystem/core/init/devices.c の中で定義されたuevent構
造体が含まれている
system/core/init/devices.c内でmknod(デバイスファイル作成)して
5-175
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

175
Androidにおけるデバイス入出力
ソフトウェア(Androidプラットフォーム)

アプリケーション
(Java)

JNI
JNI
ネイティブ
デバイス制御用
デバイス制御用

アプリケーション
(Java)

JNI

マスタ タイトルの書式設定
デバイス制御用
ライブラリ

ライブラリ

デバイスファイル
モジュール
(hoge.ko)

ライブラリ

/dev/xxx

/dev/yyy

/dev/zzz

デバイスドライバ
(モジュール)

デバイスドライバ
(組み込み)

デバイスドライバ
(組み込み)

Android
ランタイ
ム

Linuxカーネル

init.rc

insmod

WiFiアダプタ

BluetoothアダプタUSBシリアル変換ケーブル
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-176

176
デバイスドライバを
Androidのカーネルに組み込む
Androidのカーネルにドライバを組み込む方
法は通常のLinuxの場合と同じ
menuconfigの設定

マスタ タイトルの書式設定
• 組み込む場合は[*]

カーネルをビルド
• 生成されたカーネルのイメージファイルにデバイス
ドライバが組み込まれるので、既存のカーネルと差
し替える

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-177

177
デバイスドライバの
Androidカーネルモジュール作成
Androidのカーネル用のドライバのカーネル
モジュールを作成する方法は通常のLinux
の場合と同じ
マスタ タイトルの書式設定
menuconfigの設定

• モジュール作成は[M]

カーネルをビルド
• モジュール作成を指定した場合は「.ko」ファイル
が作成される

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-178

178
デバイスドライバの
カーネルモジュールを組み込む
Android起動時にモジュール「hoge.ko」を組み込むに
は?
init.<ハードウェア名>.rcにinsmodとデバイスファイルの
権限変更を記述する
/init.<ハードウェア名>.rc

マスタ タイトルの書式設定

service install_driver /etc/install_driver.sh
oneshot

実行権限をつけるのを忘れずに

/etc/install_driver.s
h
#!/system/bin/bash
insmod /data/hoge.ko
chmod 666 /dev/hoge0

$ chmod 777 /etc/install_driver.sh

root権限があるのに/system以下にアクセスできない場合
は
mount␣-o␣rw,remount␣/dev/mmcblk0p2␣/system
をadb shellで実行するかinit.rcに加えてみると良い
(パーティション名はシステムごとに異なります)
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-179

179
Androidのデバイスファイルの作成
initで生成されたNETLINK Socketデータのueventを使う
なし

init

NETLINK Socketの生成
Bind

Socketの
データ
あり

デバイスファ
イル名やデバ
イスのメ
ジャー、マイ
ナー番号など
はSocketデー
タに入ってい
る

マスタ タイトルの書式設定
handle_device_fd
Socketからデータ取り出
し

NETLINK Socket
プロセス間通信

カーネルからの通知デー
タ
(uevent構造体)

Linuxカーネル
挿抜

uevent->subsystem
の値にしたがってディレクトリ作成
/dev/xxxx

devices.c

uevent->action
remove

×

/dev/xxx/zzz

add
/dev/xxx
/zzz

デバイスファイル削 the Creative Commons
デバイスファイル作
This material is licensed under
除
License BY-NC-SA 4.0. 成

デバイスファイ
ルの権限などは
dev_perms
構造体に定義
5-180

180
devices.c について
Androidではデバイスルール的な条件はどこに設定するのか?
生成するデバイスファイルの名称, 権限、uid, gidはソース
devices.c の中の struct perms_ devperms[] で指定する
ただし、ユーザランドのコード変更なのでルートファイルシステムを
作成しなおす必要あり

マスタ タイトルの書式設定
devices.c
static struct perms_ devperms[] = {
{ "/dev/null",
0666, AID_ROOT,
{ "/dev/zero",
0666,
AID_ROOT,
{ "/dev/full",
0666, AID_ROOT,
{ "/dev/ptmx",
0666, AID_ROOT,
{ "/dev/hoge0",
0666, AID_ROOT,
{ "/dev/tty0",
0660,
AID_ROOT,
{ “/dev/cam”,
0660, AID_ROOT,
:
{ NULL, 0, 0, 0, 0 },
};
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

AID_ROOT,
AID_ROOT,
AID_ROOT,
AID_ROOT,
AID_ROOT,
AID_SYSTEM,
AID_CAMERA,

5-181

0 },
0 },
0 },
0 },
0 },
0 },
0 },

181
Android2.3での変更点(デバイス関連)
ueventdが新しく追加
ueventdのサービス起動はinit.rcのearlyinitにより起動
マスタ タイトルの書式設定
ueventdの役割
デバイスファイルの作成
デバイス情報はueventd.rcに記述
ueventd.rcの抜
粋
/dev/null
0666
/dev/zero
/dev/full
/dev/ptmx

root
root
(注意)Android2.3以降はデバイス関
0666
root
root
連の他起動スクリプト(init.rc)での変
0666 root
root
更部分がかなりあります
0666 root
root

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-182

182
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-183

183
マスタ タイトルの書式設定
第6章 NDK/JNI概要

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-184

184
6章の概要
•
•
•
•
•
•
•
•
•
•
•

NDKとは
NDKのインストール
NDKの開発手順
Eclipseのインストール
Eclipse ADT Pluginのインストール
NDKでhello-jni(実習)
アプリのデバッグ方法
ネイティブのデバッグ方法
TraceViewツール
ネイティブのログ出力
JNI詳説

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-185

185
NDK(Native Development Kit)とは
Androidアプリケーションのメソッドの一部をネイティブコードに
置き替えることができる手段
[メリット]
既存の資産であるネイティブライブラリをアプリケーションに流用可能
apkファイルの中にプラットフォームごとのにビルドしたネイティブラ
イブラリ
(.so ファイル)を同梱し実機へ簡単にインストール
アプリケーションの速度を向上
apkファイル
Linuxのシステムコール

マスタ タイトルの書式設定
Javaクラスファイル
(dex)
Xmlリソースファイル

[注意点]

JNIのオーバーヘッドの考慮が必要
マニフェストファイル、署
 必ず高速化するわけではない
名
NDKで作成した.soファイルはプラットフォーム互換が
libs/armeabi/
libs/x86/
ないのでCPUごとにリビルドして作成する必要がある ARM用(so)
X86用(so)
(ARM9用、x86用など)
すべてのC++ライブラリが使用できるわけではない
メモリとリソースの管理が重要
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-186

186
NDKの開発環境
項目

OS

必要な環境
Windows XP (32-bit) or Vista (32- or 64-bit)
→ ただしCygwin 1.7 以上が必要
Mac OS X 10.4.8 or later (x86 only)
Linux (32- or 64-bit Ubuntu8.0.4以上、またはGLibc2.4
以上のLinux)

マスタ タイトルの書式設定

Java JDK

Java JDK 6

Android SDK

Android SDK 1.5以上(*1,*2)

ツール

Cygwin : gmake, gcc
Linux : GNU Make 3.81 or later 、GNU Awk or Nawk

*1:OpenGL ESは使用するバージョンによって必要なAndroidSDKのバージョンが異なります
・OpenGL ES 1.1を使用:Android 1.6以上 android:minSdkVersion="4“
・OpenGL ES 2.0を使用:Android 2.0以上 android:minSdkVersion="5“
*2:作成するライブラリのCPUアーキテクチャの種類によりAndroidSDKのバージョンが異なり
ます
・ARM,ARM-NEON:Android 1.5以上 android:minSdkVersion=“3“
・x86:Android 2.3以上 android:minSdkVersion=“9“
5-187
This material is licensed under the Creative Commons
・MIPS:Android 2.3以上 android:minSdkVersion=“9“
License BY-NC-SA 4.0.
187
NDKインストール

本実習では実習用マシンのUbuntu on VMWareにNDKをインストール
①NDKのダウンロードサイト
(http://developer.android.com/tools/sdk/ndk/inde
x.html)

マスタ タイトルの書式設定

②Linux 32/64-bit (x86)用の最新のバージョン
のアーカイブファイル(.tar.bz2)をダウン
ロード

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-188

188
NDKインストール

マスタ タイトルの書式設定

③ダウンロードしたNDKのアーカイブを展開
④/[自分のホームディレクトリ]/.bashrcにNDKのパスを追
記
export PATH=${PATH}:~/NDKのルートディレクト

リ
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-189

189
NDKのコンポーネント
(ドキュメント docs/)
INSTALL.HTML

NDKのインストール方法

OVERVIEW.HTML

NDKの適用範囲と使用方法の概要

ANDROID-MK.HTML

C,C++のソースをコンパイルするためのAndroid.mkファイルの使用方法

APPLICATION-MK.HTML

Java用のアプリケーションとネイティブの関連付けを行うApplication.mkファイルの使用方法

CPLUSPLUS-SUPPORT.HTML

NDKでサポートしているC++についての詳細

CPU-ARCH-ABIS.HTML

サポートされているCPUのアーキテクチャとそれらのターゲットの設定方法

マスタ タイトルの書式設定

CPU-FEATURES.HTML

アプリケーションのコードでランタイムオプションとターゲットのCPUファミリーを取得するため
の静的ライブラリの使用方法

CPU-ARM-NEON.HTML

ARM NEON / VFPv3-D32

CHANGES.HTML

NDKのリリース変更履歴

DEVELOPMENT.HTML

NDKのカスタマイズおよびパッケージング方法

HOWTO.HTML

NDKに共通なタスクに関するHow To情報

IMPORT-MODULE.HTML

モジュールの再利用方法および共有方法

LICENSES.HTML

ライセンス情報

NATIVE-ACTIVITY.HTML

ネイティブアクティビティの実装方法

NDK-BUILD.HTML

ndk-buildスクリプトの使い方

PREBUILTS.HTML

ビルド済みの静的ライブラリの機能と共有方法

STANDALONE-TOOLCHAIN.HTML

NDKのツールチェインのスタンドアロンコンパイラとしての使用方法

SYSTEM-ISSUES.HTML

NDKの既知の問題

STABLE-APIS.HTML

安定版ライブラリの一覧

NDK-GDB.HTML

ネイティブコードデバッガの使用方法

docs/system/libc/OVERVIEW.HTML

bionicのCライブラリが提供できる機能一覧

オプションの使い方

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-190

190
NDKのコンポーネント
(ドキュメント docs/)

sidenavi.htmlを開けばブラウザでドキュメントが読めます

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-191

191
NDKのコンポーネント(ツール)

※NDK r8bでサポートされているツ

Native ARM、x86 、MIPSバイナリの生成のためのC/C++言語のビルドツール
gdbデバッグツール(ndk-gdb)
ネイティブコードのスタックトレースツール(ndk-stack)
プリビルドされたスタッティックライブラリ、共有ライブラリ
– Cライブラリ
• libc (C library) 、libm (math library) 、JNI、libz (Zlib
compression)、
liblog (Android logging)
–C++ライブラリ(デフォルトではlibstdc++のみ。有効にするにはコンパイルオ
プション要)
• C++最小限構成のヘッダlibstdc++(スタティックのみ)
• STLportベースのC++STL(スタティックまたは共有)
• C++例外とRTTI
– OpenGL ES 1.1 / OpenGL ES 2.0ライブラリ (3D描画エンジンライブラリ)
– libjnigraphics (ビットマップのPixel buffer へのアクセス用ライブラリ)
– OpenSL ESライブラリ(ネイティブなオーディオライブラリ)
– OpenMAX ALライブラリ(ネイティブなマルチメディアライブラリ)
5-192
This material is licensed under the Creative Commons
– Android ネイティブアプリケーションのAPI(入力サブシステム、センサデータ
License BY-NC-SA 4.0.
192

マスタ タイトルの書式設定
NDKのコンポーネント(サンプル)
hello-jni

ネイティブの共有ライブラリのメソッドから文字列を取得してUIに表示する

two-libs

ダイナミックに共有ライブラリをロードしてそのライブラリで提供されるネイティ
ブなメソッドを呼ぶ。 このサンプルで呼ばれるメソッドは共有ライブラリの中で
インポートされた別の静的ライブラリで実装されたメソッドである。

san-angeles

ネイティブなOpenGL ES APIで3Dグラフィックスを描画する。Activityのライフサ
イクルを管理GLSurfaceViewオブジェクトで管理している。

hello-gl2

三角形の頂点と断片シェーダをOpenGL ES2.0でレンダリングする。

hello-neon

ランタイム上でCPU性能のチェックができるcpufeaturesの使い方と、特定のCPUに
よってサポートされるNEON 命令の使い方。 このアプリケーションは実行したデバ
イスでFIRフィルタをループさせた際の処理の2つのバージョンのベンチマークが
とれる。(CのバージョンとNEON命令で最適化されたバージョン)

bitmap-plasma

ネイティブコードからAndroid Bitmapのピクセルバッファにアクセスするデモンス
トレーション。昔からあるような「プラズマ」エフェクトを生成する。

native-activity

ネイティブアクティビティを作成するためのnative-app-glue静的ライブラリの使
い方。

native-plasma

ネイティブアクティビティで実装されたビットマッププラズマ。

module-export

foo,bar,zoo3つのライブラリのうち、fooをスタティックライブラリとしてbarに
エクスポートする。

native-audio

OpenSLESを使ったサンプル

native-media

OPenMAXALを使ったサンプル.映像コーデック(H.264)、オーディオ(AAC)による
ストリーミング再生。

test-libstdc++

License BY-NC-SA 4.0.
最小限C++標準ライブラリのシンプルなビルドテスト

マスタ タイトルの書式設定

This material is licensed under the Creative Commons

5-193

193
NDKアプリケーションのプロジェクト構成
NDKで作成するアプリケーションのプロジェクト構成は以下の
とおり
src

Javaのコード

Android.mk

jni

C/C++のコードをビルドするのに必要な情報
ライブラリ名、依存関係、種別などを記載

マスタ タイトルの書式設定
C/C++のヘッダ、コード
JNIの規約に沿って書かれていること

drawable

<project名>/

layout

レイアウトを定義したxmlファイルを配置

values

res

画像などのリソースファイル

String.xml
文字列、色、配列、スタイルなどのxml定義ファイ
ル

AndroidManife
st.xml

アプリケーションのバージョン情報、権限、コンポーネントの動作条件
などの設定ファイル

default.prope
rties

SDKが自動生成したデフォルト設定ファイル(SDKのバージョンがr14以上
の場合はproject.propertiesという名前になる)

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-194

194
Android.mk
Android.mkに指定する変数一覧
CLEAR_VARS

先頭に“LOCAL_”とつく変数の定義
モジュールを新規で定義する場合、最初に以下の記述が必須
include $(CLEAR_VARS) # すべてのLOCAL_XXX変数クリア

BUILD_SHARED_LIBRARY

LOCAL_MODULEとLOCAL_SRC_FILESで指定したモジュールをビルドして共有ライブラリを
作成するのに必要な設定
include $(BUILD_SHARED_LIBRARY)
作成されたライブラリ名→ lib$(LOCAL_MODULE).so

BUILD_STATIC_LIBRARY

スタティックライブラリをビルドするのに必要な設定
include $(BUILD_STATIC_LIBRARY)
作成されたライブラリ名→ lib$(LOCAL_MODULE).a

PREBUILT_SHARED_LIBRARY

プレビルドされたモジュールをビルドして共有ライブラリを作成するのに必要な設定
詳細はdocs/PREBUILTS.html

PREBUILT_STATIC_LIBRARY

プレビルドされたモジュールをビルドしてスタティックライブラリを作成するのに必
要な設定
詳細はdocs/PREBUILTS.html

TARGET_ARCH

ターゲットとするアーキテクチャを指定。“arm”

TARGET_PLATFORM

ターゲットとするAndroidプラットフォームを指定。“android-<API Level>”

TARGET_ARCH_ABI

ターゲットとするARMのABIを指定。“armeabi” は Armv5TE用、“armeabi-v7a”
はArmv7用

TARGET_ABI

$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) と同義。“android-<API Level>-armeabi”
5-195
This material is licensed under the Creative Commons

マスタ タイトルの書式設定

License BY-NC-SA 4.0.

195
Android.mk
Android.mkに指定する変数一覧(モジュール詳細記述変数)
LOCAL_PATH

ビルド対象のソースファイルを参照するときの基準パス
かならずAndroid.mkの始めに定義をする

LOCAL_MODULE

生成するモジュール名を定義

LOCAL_MODULE_FILENAME

LOCAL_MODULEのオプション定義で作成されるモジュールファイルの名前を再
定義。
LOCAL_MODULE := foo-version-1
LOCAL_MODULE_FILENAME := libfoo

LOCAL_SRC_FILES

モジュールをビルドするのに必要なソースコードの指定
複数の場合はスペースで区切る

LOCAL_CPP_EXTENSION

C++ファイルの拡張子を設定。“.cxx”

LOCAL_C_INCLUDES

includeファイルのパスを設定

LOCAL_CFLAGS

C/C++のコンパイルオプションの設定

LOCAL_CXXFLAGS

C++のコンパイルオプション

LOCAL_CPPFLAGS

同上

LOCAL_STATIC_LIBRARIES

LOCAL_MODULEとリンクするスタティックライブラリを指定

LOCAL_SHARED_LIBRARIES

LOCAL_MODULEとリンクする共有ライブラリを指定

LOCAL_LDLIBS

リンカに渡すオプション

LOCAL_ALLOW_UNDEFINED_SYMBOLS

未定義のシンボルを許可するか設定

LOCAL_ARM_MODE

This material is licensed under the Creative
thumbモードとarmモードを指定 Commons

マスタ タイトルの書式設定

License BY-NC-SA 4.0.

5-196

196
Android.mk
Android.mkに指定する変数一覧(モジュール詳細記述変数)
LOCAL_ARM_NEON

NEON命令の利用を許可するか指定

LOCAL_DISABLE_NO_EXECUTE

NX bitの利用を許可するか設定

LOCAL_EXPORT_CFLAGS

static/shared ライブラリが参照先モジュールへ追加するC/C++コン
パイラフラグ

マスタ タイトルの書式設定

LOCAL_EXPORT_CPPFLAGS

LOCAL_EXPORT_CFLAGSと同じであるが C++コンパイラのみ有効

LOCAL_EXPORT_C_INCLUDES

LOCAL_EXPORT_CFLAGSと同じであるが Cのincludeパスのみ有効

LOCAL_EXPORT_LDLIBS

LOCAL_EXPORT_CFLAGSと同じであるが Cのリンカのみ有効

LOCAL_FILTER_ASM

アセンブリファイルをフィルタするシェルコマンド

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-197

197
Android.mk
Android.mkに指定する変数一覧(NDKマクロ変数)
my-dir

最後にincludeしたmakefileが含まれるディレクトリを返す。他のmkファイルをincludeし
てしまうと値が変わるのでcurrentのmakefileのディレクトリは他のファイルをincludeす
る前に取得する必要がある。

マスタ タイトルの書式設定

all-subdirmakefiles

再帰的にサブディレクトリのAndriod.mkを検索し、リストとして返す。
include $(call all-subdir-makefiles)

this-makefile

現在のmakefileのパスを返す

parent-makefile

includeされている親のmakefileのパスを返す

grand-parentmakefile

includeされている親の親のmakefileのパスを返す

import-module

プロジェクトの外にあるndkモジュールをインポートする。
$(call import-module,<name>)
とすると、NDK_MODULE_PATH/< name>/Andriod.mkが参照されるので自プロジェクト外のプ
ロジェクトのモジュールをLOCAL_STATIC_LIBRARIES += <name>と記述すればリンクするこ
とが可能。
詳細は docs/IMPORT-MODULE.html を参照。

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-198

198
サンプル(hello-jni)
NDKに付属のhello-jniサンプルをみてみましょう
<NDK>・・・/home/aj741327/android/android-ndk-r8b/

マスタ タイトルの書式設定

$<NDK>/samples/hello-jni/src/com/example/hellojni/HelloJni.java
∟ /jni/Android.mk
∟/hello-jni.c
∟ /tests
∟ /res/values/strings.xml
∟ /AndroidManifest.xml
∟ /default.properties

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-199

199
サンプル(hello-jni)
HelloJni.jav
a
package com.example.hellojni;
public class HelloJni extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
//JNIメソッドの呼び出
setContentView(tv);
し
}

マスタ タイトルの書式設定

public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}

}

//JNIネイティブメソッドの
定義
//hello-jni.soをロード
する

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-200

200
サンプル(hello-jni)
hello-jni.c
#include <string.h>
#include <jni.h>

//文字列操作に必要
//jniに必要

/* HelloJni.javaから呼ばれるJNIのネイティブメソッド
* 引数 JNIEnv* :DalvikVM環境との橋渡しをする関数群
* 引数 jobject :このメソッドが定義されている呼び元のjavaのクラス情報が格納
* 返り値 jstring :呼び元のjavaに返す文字列
*/
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) {

マスタ タイトルの書式設定

//NewStringUTF:文字列をUTF-8で新規作成して呼び元に返す

return (*env)->NewStringUTF(env, "Hello from JNI !");
}

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-201

201
サンプル(hello-jni)
Android.m
k
LOCAL_PATH :=

$(call my-dir)

include $(CLEAR_VARS)

#「Android.mk」ファイルの先頭で必ず
指定
#LOCAL_XXXという変数をすべてクリア

LOCAL_MODULE

#ライブラリ名(モジュール名)の定義

マスタ タイトルの書式設定
:= hello-jni

LOCAL_SRC_FILES := hello-jni.c #ライブラリのソースコード指定
include $(BUILD_SHARED_LIBRARY) #共有ライブラリを作成する設定
( LOCAL_PATH /lib/libhellojni.so)

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-202

202
実
習

hello-jniの共有ライブラリを生成しましょう
[host_pc~] > cd␣<NDK>/samples/hello-jni
[host_pc~] > ls
AndroidManifest.xml default.properties
tests
[host_pc~] > ndk-build

jni

res

src

マスタ タイトルの書式設定

Gdbserver
: [arm-linux-androideabi-4.6]
libs/armeabi/gdbserver
Gdbsetup
: libs/armeabi/gdb.setup
Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install
: libhello-jni.so =>
libs/armeabi/libhello-jni.so
[host_pc~] > ls
AndroidManifest.xml default.properties
res src tests

jni

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

libs

obj

5-203

203
hello-jniの共有ライブラリの生成場所

$<NDK>/samples/hello-jni/src/com/example/hellojni/HelloJni.java
∟ /jni/Android.mk
∟/hello-jni.c
∟ /libs/armeabi/gdb.setup
∟ /gdebserver
生成された共有ライブラリ
∟ /libhello-jni.so
∟ /obj/local/armeabi/libhello-jni.so
∟/objs-debug/hello-j

マスタ タイトルの書式設定
∟ /tests
∟ /res/values/strings.xml
∟ /AndroidManifest.xml
∟ /default.properties

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-204

204
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-205

205
NDKを用いたアプリケーション開発手順
Javaとネイティブライブラリ間のインタフェースを決定
ツール類インストール(SDK,NDK,Eclipse,ADT)

Javaのパースペクティブ

EclipseでAndroidアプリケーションプロジェクト作成

マスタ タイトルの書式設定
プロジェクトにNative Suportを設定

C/C++のパースペクティブ

ネイティブコードおよびAndroid.mk作成・配置

Javaのパースペクティブ
AndroidのJavaのコードやリソースファイル作成、ネイティブライブラリの定義・ロードなど
ARM用モジュールの場合
project>/libs/eabi/以下に
生成

Build Project実行

C/C++のパースペクティブ

Apkファイルはproject>/bin/以下に生
ライブラリ(.so)および、アプリの実行ファイル( .apk)生成 成

実機またはエミュレータにインストールして動作確認
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-206
Eclipseインストール
ダウンロードサイト(Eclipse
Developers)

IDE for Java

http://www.eclipse.org/downloads/packages/release/indigo/sr2

マスタ タイトルの書式設定

Eclipse IDE for
Java Developers
のLinux32bit版を選
択
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-207

207
Eclipseインストール

マスタ タイトルの書式設定
「eclipse-java-indigo-SR2linux-gtk.tar.gz」 をダウン
ロードして任意の場所で展開
※本実習では
/home/aj741327/eclipse(indigo)
に展開しています

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-208

208
Eclipse ADT plugin インストール

マスタ タイトルの書式設定
①eclipse実行
②Workspace
「/home/aj741327/workspace」
③Java開発用パースペクティブを開
く

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-209

209
Eclipse ADT plugin インストール

マスタ タイトルの書式設定
Eclipseメニュー->Help->Install New
Software
両方にチェックを付
ける

https://dlssl.google.com/android/eclipse/is licensed under the Creative Commons
This material
License BY-NC-SA 4.0.

5-210
Eclipse ADT plugin インストール

「I accept・・・」に
チェック

マスタ タイトルの書式設定
セキュリティ警告⇒O
K

CDT(C/C++開発用Eclipseプラ
グイン)も自動でインストー
ルされた状態で起動される
Welcomeタブは×ボタンで閉じ
る

Eclipse 再起動
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-211
Eclipse ADT plugin インストール

ADTがインストールさ
れるとこのようなボ
タンが追加される

マスタ タイトルの書式設定

AndroidSDKがある場
所のパスを指定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

AndroidNDKがある場
所のパスを指定

5-212
実
習

NDKサンプル「hello-jni」の
アプリケーションプロジェクト作成

今回はNDK付属のサンプル「hello-jni」を動作させるた
アプリケーションプロジェクトの作成
めに
「・・・from Existing Code」を選択
NDK付属のサンプル「hello-jni」がある場所を
指定

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-213
実
習

NDKサンプル「hello-jni」の
アプリケーションプロジェクト作成
Javaのパースペクティブにプロジェクトが作成さ
れる

マスタ タイトルの書式設定
プロジェクト名を選択して右ク
リック

NDKで作成するライブラリの名前を設
定

Android Tools -> Add Native
Support
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-214
実
習

NDKサンプル「hello-jni」の
アプリケーションプロジェクト作成
C/C++のパースペクティブに自動で切り替わる

マスタ タイトルの書式設定
同名のc++のコードも自動で作成されるが
ここでは使用しない
libsやobjディレクトリも自動で生成され
るが
中身はまだ空

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-215
実
習

NDKアプリ「hello-jni」のビルド
プロジェクト名を選択して右ク
リック

マスタ タイトルの書式設定
「Build Project」実行

「Build が成功すると
「libs」配下にライブラリ
が作成される
同時にAndroidアプリケー
ションの実行ファイルであ
るapkも作成される
※ビルドのログ(エラーログも含む)はEclipseのConsole Viewに表
5-216
This material is licensed under the Creative Commons
示される
License BY-NC-SA 4.0.
実
習

「hello-jni」のアプリケーション
動作確認準備
Eclipseのメニューボタン(実
行)

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-217
実
習

「hello-jni」のアプリケーション
動作確認準備
適当に名前をつける

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-218
実
習

「hello-jni」のアプリケーション
動作確認準備
①下図のように接続し、
JP2をOPENで
Armadilli440の電源をいれる

②ホストPCのシェルからadbサーバ起動

マスタ タイトルの書式設定
192.168.1.10

[host_pc~] > adb␣kill-server
[host_pc~] > adb␣start-server
* daemon not running. starting it now
on port 5037 *
* daemon started successfully *
[host_pc~] > adb␣devices
List of devices attached
emulator-5554 device

192.168.1.11

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-219

219
実
習

「hello-jni」アプリケーション実行

実機選択

マスタ タイトルの書式設定

Armadillo-440上で動作したNDKサンプルの「helloYesを選択すると自動でLogcatのViewが
jni」
表示されアプリケーションのログが確
5-220
This material is licensed under the Creative Commons
認できる
License BY-NC-SA 4.0.

220
実
習

HelloJniデバッグ(DDMS)
DDMSパースペクティブ表示

選択したプロセ
スのスレッド情
報や
メモリ情報

マスタ タイトルの書式設定
「hello-jni」アプリのプロセス
ログ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-221

221
アプリケーションのJava側のデバッグ
Eclipseのデバッガ機能を用いてブレークポイントによる
ステップごとの処理の解析(Java側のデバッグ)
Debugパースペクティブ自動表示

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-222

222
アプリケーションのネイティブ側の
デバッグ
ログを出力させてLogcatで確認
(android/log.h)

マスタ タイトルの書式設定
gdbを使う
gdbサーバによる実機へのアタッチ
gdbツールによるネイティブコードのステップデ
バッグ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-223

223
LogcatにネイティブのLogを出力させる
Android.m
k
LOCAL_LDLIBS

#リンカに渡すオプション

:= -llog

hello-jni.c
#include <string.h>
#include <jni.h>
#include <android/log.h> //ログ出力ライブラ

マスタ タイトルの書式設定
リ

void Hoge( ) {
// 引数 ( ログフラグ<trueがログ有効>,
“ タグ “,
“タグメッセージ” )
__android_log_write(ANDROID_LOG_DEBUG, "HelloNDK", "congratulation!");

}

ログ関数 __android_log_write

文字列出力

__android_log_print

文字列出力(printf相当)

__android_log_vprint

文字列出力(va_list版)

__android_log_assert

アサート

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-224

224
参
考

ログ関数を簡素化する
自作の logdebug.h をincludeすれば簡素化したログ関数を使用可能

logdebug.h
:
#include <android/log.h>

hello-jni.c
//ログ出力ライブラ
リ

#include <string.h>
#define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#include <jni.h>
#define LOGV(...) ((void)0)
#include “logdebug.h”
//簡素化したマクロが定義してる
:
ヘッダ
:
void Hoge( ) {
#define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
LOGE(“Error!!”);
#define LOGD_IF(cond, ...)
LOGD_IF(debug, “class name = ‘%s’", className);
( (CONDITION(cond)) ? ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) : (void)0 ) method");
LOGD_IF(debug, “++++ in
#define LOGI(...) ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
}
#define LOGI_IF(cond, ...)
( (CONDITION(cond)) ? ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) : (void)0 )
#define LOGW(...) ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
#define LOGW_IF(cond, ...)
( (CONDITION(cond)) ? ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) : (void)0 )
#define LOGE(...) ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
#define LOGE_IF(cond, ...)
( (CONDITION(cond)) ? ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) : (void)0 )
:
#define android_printLog(prio, tag, fmt...)
__android_log_print(prio, tag, fmt)
#define android_vprintLog(prio, cond, tag, fmt...)
__android_log_vprint(prio, tag, fmt)

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-225

225
gdbの使い方
• コマンドラインからgdbを使う
① 「ndk-build –B NDK_DEBUG=1」 でビルドする
② アプリケーションのAndroidManifest.xmlの
debuggable属性をtrueにしてapkを作成する
③ デバッグ対象のアプリケーションをエミュレータか
実機で起動
④ アプリケーションのプロジェクトのルート直下で
「ndk-gdb --start」を実行
⑤ gdb起動、初期化後(gdb)プロンプトが出現

マスタ タイトルの書式設定

※ただしgdb起動・初期化完了まで時間がかかるのでアプリ起動直後にJNIを
コールしているようなアプリではデバッグは難しい
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-226

226
gdbの基本的なコマンド
コマンド
continue

意味
c

info break

実行再開
現在設定されているブレークポイント情
報

マスタ タイトルの書式設定
b
ブレークポイントの設定

break <行数>
delete

d

ブレークポイントの削除

next

n

1行実行。関数へのステップインは行わな
い

step

s

ステップイン実行

finish

f

現在の関数を最後まで実行して停止

print <変数名>

p

変数の値の参照

quit

q

gdb終了
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-227

227
gdbの使い方
• Eclipseからgdbを使う
https://sites.google.com/a/android.com/tools/recent/usingthend
kplugin

マスタ タイトルの書式設定

CDTのパースペクティブにて
プロジェクトの右クリック
でPropertiesを選択

「C/C++Build」のBuilder Settingsにて
Build Commandに「ndk-build NDK_DEBUG=1」
を設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-228

228
gdbの使い方

マスタ タイトルの書式設定
CDTのパースペクティブにて
プロジェクトの右クリック
で
「Debug As」⇒「Android
Native Application」を選
択

アプリケーションが実機またはエミュレー
タにインストールされDebugパースペク
ティブが開きステップ実行などのデバッグ
が可能になる

※ただしgdb起動・初期化完了まで時間がかかるのでアプリ起動直後にJNIをコールしてい
るようなアプリではデバッグは難しい
http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc5-229
This material is licensed under the Creative Commons
debugging/
License BY-NC-SA 4.0.
229
その他
アプリケーションのデバッグ
テストAPI(junit.framework)
JUnit を基本にした Android のテストスイート
Android の API を呼び出さない純粋な JUnit テスト
Android のコンポーネントをテストする Android のJUnit 拡張テ
スト

Monkey
マスタ タイトルの書式設定
エミュレータインスタンスやデバイスで動作するコマンドライン

ツール
クリックやタッチなどのユーザーの操作イベントやシステムのイ
ベントをランダムに発生させてシステム内に送信
ストレステストの一種として使用可能

monkeyrunner ツール
API から特定のコマンドやイベントを送信することにより、ワー
クステーションからデバイスやエミュレータを制御することを
可能にする

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-230

230
高速化したか確かめる
SDKのTraceViewツールを使 ・スレッドごとにグラフが分かれている
public class HelloJni extends Activity {
・グラフは時系列で表示されており。その時間に実行され
用
@Override
た
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

メソッドごとに色分けされている
・グラフの拡大可能
・グラフをクリックすることでそのメソッドがコールされ
ている場所
の一覧と関連情報がプロファイルパネルに反映される

マスタ タイトルの書式設定

Debug.startMethodTracing(“test”);
String str = getParametar();
//String str = stringFromJNI(); //ここの処理にかかる時間を測
Debug.stopMethodTracing(); 定
TextView tv = new TextView(this);
tv.setText( str);
setContentView(tv);
}
private String getParametarFromJava() {
//浮動小数点演算などの重い処理
return str;
}
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
}

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-231

231
TraceViewの使い方
コードにDebug.startMethodTracingを仕込んだアプリを実機で実行
実機の/sdcard/にtest.traceが生成
[host_pc~] > adb pull
/sdcard/test/trace ./
[host_pc~] > traceview ./test.trace

name

メソッド名

Incl%

最大経過時間に対するインク
ルーシブタイムの割合

マスタ タイトルの書式設定
包括時間

Excl%

最大経過時間に対するイクスク
ルーシブタイムの割合

Exclusive

降順にソート

Inclusive

実際にメソッドの実行に費やさ
れた時間

Calls+Recu コール回数+再帰的にコールされ
r
る回数、合計コール回数
Calls/Tota
l
解析方法
Time/Call
平均タイム
① Excl%の値が高いメソッドを見つけて最適化す
る
② Incl%の値が高いメソッドを見つけて最適化す
る
5-232
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

232
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-233

233
JNIとは
Java Native Interface

アプリ

Java

Javaとネイティブ間を連携する仕組み
AndroidのFramework内でもJNIが多用
Java⇔ネイティブ間の結合用ライブラ
リと
インタフェースの規約によって連携を
実現

層

Java

アプリケーショ
ン
アプリケーション
フレームワーク

マスタ タイトルの書式設定

JNIをAndroidで利用することで
ネイティブの資産を使えます
現在のAndroidに存在しないAPI
を拡張できます

フレームワーク

JNI
ネ
イ
テ
ィ
ブ
層

Androidランタイム
コアライブラリ

ネイティブ
モジュール

C/C++

Dalvik
仮想マシン

ライブラ
リ
Linuxカーネル2.6

ドライバ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-234

234
JNIの型定義(プリミティブ型)
JNIではJavaのプリミティブな型をC/C++で別名定義しています
Javaの型名

C/C++の型名

備考

boolean

jboolean

unsigned 8bit

byte

jbyte

signed 8bit

//利便性のために定義されている定
数
#define JNI_FALSE 0 //false
#define JNI_TRUE 1 //true

マスタ タイトルの書式設定

char

jchar

unsigned 16bit

short

jshort

signed 16bit

int

jint

signed 32bit

long

jlong

signed 64bit

float

jfloat

32bit

double

jdouble

64bit

//整数添え字、サイズ
typedef jint jsize;

Java

ネイティブ(C/C++)

package com.sample;
public class HelloJni {
public native int getValue();
}

jint Java_com_sample_HelloJni_getValue
( JNIEnv* env,
jobject thiz )
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-235

235
JNIの型定義(参照型)
JNIではJavaのオブジェクトを参照する型をC/C++で別名定義していま
す
Javaのオブジェクト
C/C++の型名
すべてのJavaオブジェクト

jobject

java.lang.Class

jclass

マスタ タイトルの書式設定
java.lang.String

jstring

Object配列

jobjectArray

boolean配列

jbooleanArray

byte配列

jbyteArray

char配列

jcharArray

short配列

jshortArray

int配列

jintArray

long配列

jlongArray

float配列

jfloatArray

double配列

jdooubleArray
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-236

236
JNIの文字列の取り扱い
Javaの文字列はUNICODEなのでJNIでも文字列はUNICODEで扱う
JNIにおいてUTF-8の文字列を扱う専用の関数
jstring NewStringUTF
(JNIEnv* env, const char *bytes);

マスタ タイトルの書式設定
jsize GetStringUTFLength
(JNIEnv *env, jstring string);

【メソッドの機能】
【メソッドの機能】
文字列の長さを変更後の UTF-8 によるバイト数で返す
変更後の UTF-8 エンコーディングによる文字配列から
【パラメータ】
新しい java.lang.String オブジェクトを生成
env:JNI インタフェースポインタ
【パラメータ】
string:Java 文字列オブジェクト
env:JNI インタフェースポインタ
bytes: 変更後の UTF-8 文字列を参照するポインタ 【戻り値】
文字列の UTF-8 長を返す
【戻り値】
Java 文字列オブジェクト
文字列が構築できない場合は NULLを返す

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-237

237
JNIの配列型の取り扱い
C/C++の配列をJNI用の配列に変換する関数(例:int配列の場合)
jintArray NewIntArray
(JNIEnv *env, jsize
length);

jint* GetIntArrayElements
(JNIEnv *env, jinitArray array, jboolean *isCopy);

【メソッドの機能】 int配列の新規作成
【メソッドの機能】プリミティブ配列の本体を返す
【パラメータ】 env:JNI インタフェースポインタ
【パラメータ】 env:JNI インタフェースポインタ
length:配列の大きさ
array:参照元のJava配列
【戻り値】 jintArray型で作成した配列
isCopy:参照方法指定
【戻り値】配列要素を参照するポインタ
演算が失敗した場合は、NULL

マスタ タイトルの書式設定

jsize GetArrayLength
(JNIEnv *env, jarray array);
【メソッドの機能】 配列の大きさ取得
【パラメータ】 env:JNI インタフェース
ポインタ
array:参照元のJava配
列
【戻り値】 配列の要素の数

void ReleaseIntArrayElements
(JNIEnv *env, jinitArray array, jint* elems, jint mode);
【メソッドの機能】確保したプリミティブ配列のメモリを開
放する
【パラメータ】 env:JNI インタフェースポインタ
array:参照元のJava配列
elems:開放するint型データ
mode:Java配列への反映と解放の可否

JNI関数を利用して配列のリソースを確保した場合は最後に必ず解放する
こと
5-238
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

238
メソッド命名規則と引数
JNIのネイティブメソッド名の命名規則
接頭辞 Java_
分解された完全修飾クラス名
下線 (「_」) 区切り文字
分解されたメソッド名
JNIのネイティブメソッドの引数はJavaのメソッドの引数
のほかに
必ず以下の引数が必要
第1引数 : JNIEnv* (JNIインタフェースポインタ)
第2引数 : jobject (呼び元のJavaのインスタンス参照注
1)

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-239

注1:呼び元のJavaで定義したJNIメソッドがstaticの場合はJavaクラス(jclass)の

239
メソッド命名規則と引数
package com.example.hellojni;
Javaのコード

public class HelloJni {
public native int getValue();
public native void setValue(int value);
public native String addName(String str1, String str2);
}

マスタ タイトルの書式設定
Cのコー
jint Java_com_example_hellojni_HelloJni_getValue( JNIEnv* env, jobject thiz ) { }
ド

void Java_com_example_hellojni_HelloJni_setValue
( JNIEnv* env, jobject thiz, jint value ) { }
jstring Java_com_example_hellojni_HelloJni_addName
( JNIEnv* env, jobject thiz, jstring str1, jstring str2 ) { }

JDKのjavahを使用すれば自動でネイティブ側のメソッド名が定義されたヘッダファイル
HelloJni.classを指定してHelloJni.h を自動生成する

$ javah –classpath bin/classes –d jni
This material is licensed under the Creative Commons
com.example.hellojni.HelloJni
License BY-NC-SA 4.0.

5-240

240
JNIのしくみ
ネイティブコードは、JNI 関数を呼び出してJava VM機能に
アクセスする
JNIインタフェースポイ
ンタ「JNIEnv」型
(このスレッドのみ有
効)

JNI 関数のポイン
タを格納する構造
体

マスタ ポインタ
タイトルの書式設定
ポインタ
(ポインタ配列のポイン
タ)

スレッドごとの
データ構造

ポインタ
ポインタ

JNIインタフェース
関数

JNIインタフェース
関数
JNIインタフェース
関数

http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/jni/spec/jniTOC.htm
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-241

241
JNIのしくみ
常にJNIインタフェースポインタ
env
を使用してJava オブジェクトを操
作
jdouble Java_pkg_Cls_f__ILjava_lang_String_2
( JNIEnv *env, /* interface pointer */
jobject obj,
/* "this" pointer
*/
jint i,
/* argument #1
*/
jstring s)
/* argument #2
*/
{
/* Obtain a C-copy of the Java string */
const char *str = (*env)->GetStringUTFChars(env, s, 0);
/* process the string */
...
/* Now we are done with str */
(*env)->ReleaseStringUTFChars(env, s, str);
return ;
...
}

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-242

242
JNIのロード/アンロード
jint JNI_OnLoad(JavaVM *vm, void *reserved);
Java側のSystem.loadLibraryによりネイティブライブラリがロードされたとき
にVMに呼ばれるメソッド
このメソッドをエクスポートしていない場合はVMで認識されるJNI バージョン
のデフォルト値「JNI_VERSION_1_1」 となる
戻り値のバージョン番号が不正な値の場合:ネイティブライブラリをロード不
可
パラメータ
vm : インタフェース取得元の仮想マシンインスタンス
戻り値
JNI バージョン

マスタ タイトルの書式設定

void JNI_OnUnload(JavaVM *vm, void *reserved);
VMのネイティブライブラリを含むクラスローダのガベージコレクションのときに
呼ばれるクリーンアップオペレーション用メソッド
パラメータ
vm : インタフェース取得元の仮想マシンインスタンス
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-243

243
JNIEnvのポインタ取得
jint GetEnv(JavaVM *vm, void **env, jint version);
JavaVMのインスタンスからJNIインタフェースポインタを取得するためのメ
ソッド
パラメータ
vm
: インタフェース取得元の仮想マシンインスタンス
env
: 現在のスレッドの JNI インタフェースポインタの配置位置を参照
する
ポインタ
version : 要求された JNI バージョン
戻り値
現在のスレッドが VM に接続されていない場合:*env を null に設定し、
JNI_EDETACHED を返す
指定したバージョンがサポートされていない場合:*env を null に設定し、
JNI_EVERSION を返す
それ以外の場合:*env を適切なインタフェースに設定し、JNI_OK を返す

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-244

244
JavaVMへの接続/切断
jint AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args);
現在のスレッドを Java VM へ接続。すでに接続されているスレッドへの接続は無
操作
JNIEnv 引数で JNI インタフェースポインタを返す
パラメータ
vm
: 現在のスレッドが接続される VMのインスタンス
p_env
: 現在のスレッドの JNI インタフェースポインタが配置される位置
へのポインタ
thr_args
: NULL または JavaVMAttachArgs 構造体を参照するポインタにして
追加
情報を指定
jint DetachCurrentThread(JavaVM *vm);
戻り値
JNI_OK /
VM からメインスレッドを切り離す JNI エラーコード

マスタ タイトルの書式設定

パラメータ
vm
: 現在のスレッドが分離される VMのインスタンス
戻り値
JNI_OK / JNI エラーコード
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-245

245
VMの参照(サンプルコード)
JavaVM *gJavaVM; //グローバル参照
//Java側のSystem.loadLibraryで呼ばれる
jint JNI_OnLoad(JavaVM *vm, void *reserved){
gJavaVM = vm;
return JNI_VERSION_1_6;
}
void *myThread(void *arg) {
int status = (*gJavaVM)->GetEnv(gJavaVM, (void **) &env, JNI_VERSION_1_6);
if ( status < 0 ){//VMに未接続の場合このスレッドをVMに接続させる
status = AttachCurrentThread(JavaVM *vm, JNIEnv **p_env, void *thr_args);
if(status < 0 ) //エラー
return;
}
//VMからJava側のメソッド呼び出しなどの処理
}
//VMのネイティブライブラリを含むクラスローダがGCされるときに呼ばれる
void JNI_OnUnload(JavaVM *vm, void *reserved) {
int status = (*gJavaVM)->DetachCurrentThread(gJavaVM);
if ( status < 0 ) //エラー
}

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-246

246
Javaからネイティブ呼び出し
①Javaのコード作成、ビルド
HelloJni.java → HelloJni.class
package com.example.hellojni;
public class HelloJni {
static {
System.loadLibrary("hello-jni");
}
public native boolean setValue(int value);

③Cのコード作成(hello-jni.c)
- com_example_hellojni_HelloJni.h をinclud
- JNIメソッド内の処理作成
#include <string.h>
#include <jni.h>
#include <com_example_hellojni_HelloJni.h>
jboolean
Java_com_example_hellojni_HelloJni_setValue
( JNIEnv* env, jobject thiz, jint value ) {
sum = 100 + value;
if( sum > 100 ){
return JNI_TRUE;
return JNI_FALSE;
}

マスタ タイトルの書式設定

public static void main(String[] args) {
HelloJni jni = new HelloJni ();
Boolean res = jni.setValue ( 1 );
}
}
②javahでJNIヘッダファイル作成

④ビルドしてlibhello-jni.so作成/共有ライ
ブラリ用ディレクトリに配置

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-247

247
Javaからネイティブ呼び出し
HelloJniアプリ実行

呼び元のHelloJniから引数が渡される
- env
:JNIインタフェースポインタ
- jobject:HelloJniクラスのオブジェクト
- value :1
処理実行
結果( JNI_TRUE (1)) を返す

マスタ タイトルの書式設定

libhello-jni.soをロード
main()を実行
HelloJniのインスタンス生成
ネイティブのsetValue(1)呼び出し

Boolean res == true

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-248

248
ネイティブからJavaメソッド呼び出し
①Javaのコード作成、ビルド
HelloJni.java → HelloJni.class
package com.example.hellojni;
public class HelloJni {
static {
System.loadLibrary("hellojni");
}
protected static native void
setHogeObject();
protected static void
setHoge(int value){
Log.i("Test", "hoge" +
value);
}
public static void main(String[]
args) {
HelloJni jni = new HelloJni();
jni.setHogeObject();
②javahでJNIヘッダファイル作成
}
}

③Cのコード作成(hello-jni.c)
- com_example_hellojni_HelloJni.h をinclude
- JNIメソッド内の処理作成
void
Java_com_example_hellojni_HelloJni_setHogeObject
(JNIEnv *env, jclass clazz) {
jmethodID mid = (*env)->
GetStaticMethodID(env, clazz, “setHoge", "(I)V");
(*env)->CallStaticVoidMethod(env, clazz, mid, 5);
return;
}

マスタ タイトルの書式設定
呼び元のJavaで定義したJNIメ
ソッドがstaticの場合は
java.lang.Classの参照になる

④ビルドしてlibhello-jni.so作成/共有ライ
ブラリ用ディレクトリに配置

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-249

249
ネイティブからJavaメソッド呼び出し

HelloJniアプリ実行
libhello-jni.soをロード
main()実行
HelloJniのインスタンス生成
ネイティブのsetHogeObject呼び出し

呼び元のHelloJniからsetHogeObjectに
引数が渡される
- env :JNIインタフェースポインタ
- clazz:HelloJniクラスの
java.lang.Class
オブジェクト

マスタ タイトルの書式設定

呼び出すJavaのメソッド名
“setHoge”とシグネチャからメソッ
ドID取得
CallStaticVoidMethod実行
JavaのメソッドsetHoge(5)を呼ぶ
setHoge(5)が呼ばれて
「hoge5」とログ表示
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-250

250
Javaメソッドの表現
JNIではJavaのオーバーロード関数はメソッド名と引数リストの組み
合わせで識別する。Javaの型にはそれぞれ型のシグニチャーが決めら
れているので引数リストはそれらのシグニチャーで構成する
Javaの型の
シグニチャー

Java型名

Z

boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

double

L

完全指定のクラス

[

型[](型の配列)

V

void

Javaメソッド
long hoge(int n, String s, int[] arr);

マスタ タイトルの書式設定
シグニチャー表現
(ILjava/lang/String;[I)J

JDKのjavapを使用すれば指定されたク
ラスのメソッドのシグニチャーが表示
されます

$ javap –s <完全指定のJavaクラスファイル名>

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-251

251
ネイティブからのオブジェクトの参照
Java
Classオブジェク
ト

クラス名か
ら取得

jclass clazz = (*env)-> FindClass(env,"Ljava/lang/Object;");

返り値のNULL
チェック要

インスタン
スから取得

jclass clazz = (*env)->GetObjectClass(env, obj);

返り値のNULL
チェック要

jmethodID mid = (*env)-> GetMethodID(env,clazz, "メソッド名", “SIG");
jint response = (*env)-> CallIntMethod(env, obj, mid, 引数…); *

Javaメソッド

midのNULL
チェック要

マスタ タイトルの書式設定

static
Javaメソッド

Javaオブジェク
トのフィールド
値
static なJavaオ
ブジェクトの
フィールド値

呼び出し

jmethodID mid = (*env)-> GetStaticMethodID(env,cclazz, "メソッド名",
“SIG");
jint response = (*env)-> CallStaticIntMethod(env, clazz, mid, 引数…); *
jfieldID fid = (*env)-> GetFieldID(env, clazz, "フィールド名", "I");
jint response = (*env)-> GetIntField(env, obj, fid); *

fidのNULL
チェック要

取得
jfieldID fj = (*env)-> GetStaticFieldID(env, clazz, "フィールド名", "I");
jint response = (*env)-> GetStaticIntField(env, clazz, fid); *

この関数を呼
ぶことでロー
すべてのJavaオ
ローカル参 (*env)->DeleteLocalRef(env, obj);
カル参照が終
ブジェクト *JNI関数の名前はコールするメソッドや取得するフィールドの型によって変わります
照の終了
obj = NULL;
了したとみな
される
<type> Call<type>Method(JNIEnv*, jobject, jmethodID, ・・・)

<type> CallStatic<type>Method(JNIEnv*, jclass, jmethodID, ・・・)
<type> Get<type>Field(JNIEnv*, jobject, jfieldID, ・・・)
<type> GetStatic<type>Field (JNIEnv*, jclass, jfieldID, ・・・)
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-252

252
JNIの例外処理
JNI では、ネイティブメソッドは任意の Java の例外を発生させることが可能
try~catchに当たる部分は 自分でコーディングする必要がある
env*->Throw((env, jthrowable)e);
return;

必ずreturn要

jclass clsj = env->FindClass("Ljava/lang/RuntimeException;");
if (clsj==NULL) return;
env*->ThrowNew(env, clsj, "message");
env*->DeleteLocalRef(env, clsj);
return;

ローカル参照の
jclass は必ず
DeleteLocalRefする
こと

マスタ タイトルの書式設定

例外発生

再throw

if (env* -> ExceptionCheck ( env))
return;

特定の種類の
例外をcatch

jclass reClsj = env*->FindClass ( env, "Ljava/lang/RuntimeException;");
if (reClsj==NULL) return;
//予めRuntimeExceptionのオブジェクトを用意しておく
jthrowable ej = env* -> ExceptionOccurred ( env );
if (ej!=NULL && env*->IsInstanceOf ( env, ej, reClsj ){
//例外補足したときの処理
}

例外無視

env*->ExceptionClear( env );

致命的エラー

env*->FatalError( env, "malloc() is null");
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

ローカル参照の
jclass は必ず
DeleteLocalRefする
こと

Javaも終了する
5-253

253
まとめと次回予告
5章ではLinuxやAndroidにおけるハードウェアの組み込みの仕組み
を理解し実際のカーネルに組み込むためのドライバモジュールの
作成をして組み込むことができるようになりました
また6章においてネイティブライブラリを含んだAndroidのアプリケー
ションを作成するためにNDKの使い方を理解し、ネイティブーJava
間でやり取りをする仕組みであるJNIの規約について学びました

マスタ タイトルの書式設定

次章からはいよいよこれまで学んだことを生かして
Armadillo-440上のAndroidにUSBシリアル変換ケーブルを組込み
シリアル通信インタフェースで動作するデバイスを使ったAndroid
アプリケーションを作成し、実際に動作させてみましょう

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-254

254
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-255

255
第7章 シリアルデバイス
マスタ タイトルの書式設定

アプリケーション作成

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-256

256
7章の概要
•
•
•
•
•
•
•
•
•

実習で使用するデバイスの前提知識
システム構成
アプリケーション構成
デバイスファイル名の確認方法
デバイスの組込み
カーネルの移植
ユーザランドのファイルシステム作成と移植
デバイス制御アプリケーションを動作させる
デバッグ方法

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-257

257
バーコードリーダー仕様
• 本実習ではバーコードリーダーを使用します
• TSK-R CCD RS232C バーコードリーダー(FKSYSTEM製
)
– タッチ式CCDバーコードリーダー(0mm~最大2cm程度)
– JANコード(市販の商品等)、NW-7(宅配便の送り状等)、
Code39、Code128(社内伝票等)
– シリアル通信インタフェース

マスタ タイトルの書式設定
•
•
•
•

ボーレート
: 9600
データビット : 8bit
ストップビット : 1
パリティ制御 : なし

– データ送受信用ケーブルの端子
• RS232C

– 給電用ケーブルの端子
• USB

– 接続先へ送信する解析データの構成
• フレームの先頭データの値
: アスキー[FF](
HEX:0D)
5-258
This material is licensed under the Creative Commons
• フレームの末尾データの値 License BY-NC-SA 4.0. : アスキー

258
USBシリアルケーブル仕様
• USBシリアルケーブル
– SRC06USB(Arvel)
– Linux汎用FTDIドライバ使用可能

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-259

259
実習課題
①バーコードリーダー
アプリ起動
シリアル

Armadillo-440 ACアダプタクロスケーブル
( Android 2.2)

給電用USB

開発用PC

マスタ タイトルの書式設定
バーコードリー
USB-RS232C
変換ケーブル

ダー
USB
RS232C
LANケーブル

③書籍情報表示

②書籍バーコード
をタッチ!

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-260

260
ソフトウェア構成図
実装箇所
アプリケーション
アプリ
画面

Home

Contacts

Phone

Browser

アプリケーションフレームワーク
アクティビティ
マネージャ

ウィンドウ
マネージャ

コンテンツ
プロバイダ

ビューシステム

通知マネージャ

パッケージ
マネージャ

電話
マネージャ

リソース
マネージャ

位置
マネージャ

XMPP
サービス

マスタ タイトルの書式設定
シリアル通信
マネージャ

JNI
シリアル
インタフェース
ライブラリ

ライブラリ

Androidランタイム

サーフェス
マネージャ

メディア
フレームワーク

SQLite

コアライブラリ

OpenGL | ES

FreeType

WebKit

Dalvik
仮想マシン

SGL

SSL

Libc

HARDWARE ABSTRACTION LAYER

WiFi

Audio

Camera

Radio(RIL)

・・・

ディスプレイ
ドライバ

Bluetooth
ドライバ

カメラドライバ

フラッシュメモリ
ドライバ

バインダ(IPC)
ドライバ

キーパッド
ドライバ

USBドライバ

WiFiドライバ

オーディオ
ドライバ

電源管理

Graphics

Linuxカーネル 2.6

カーネルに
組み込む

USBシリアル
ドライバ
(FTDI)

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-261

261
デバイスドライバとデバイスファイル名確認
【接続環境】
開発用PC ⇔ RS232C変換ケーブル

このデバイスの
デバイスドライバとデ
バイスファイル名を確
認する

開発用PC

マスタ タイトルの書式設定
USB-RS232C
変換ケーブル

USB

RS232C

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-262

262
デバイスドライバとデバイスファイル名確認

①開発用PCにデバイス挿入前

※すでに本研修で
開発用PCに接続して
しまっているので
①は確認できません

[host_pc~] > lsmod

マスタ タイトルの書式設定

Module
binfmt_misc
nfsd
exportfs

Size Used by
6587 1
238871 13
3437 1 nfsd

[host_pc~] > ls␣/dev/tty*

:
/dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59
/dev/ttyS3
/dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 / dev/tty6

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-263

263
実
習

デバイスドライバとデバイスファイル名確認

【環境】
開発用PCのLinuxシェル

②開発用PCにデバイス挿入後
[host_pc~] > lsmod

Module
ftdi_sio
usbserial
binfmt_misc
nfsd
exportfs

Size
Used by
①と②を見比べる
34252 USB SERIALにはFTDI_SOドライバが
1
33694
3 ftdi_sio
使われていることがわかる
6587
1
238871
13
3437
1 nfsd

マスタ タイトルの書式設定

[host_pc~] > ls␣/dev/tty*

:
/dev/tty15 /dev/tty26
/dev/ttyS3
/dev/tty16 /dev/tty27
/dev/ttyUSB0

/dev/tty37

/dev/tty48

/dev/tty59

/dev/tty38

/dev/tty49

/dev/tty6

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-264

264
実
習

カーネルコンフィギュレーションの
編集と適用と確認

【環境】
開発用PCのLinuxシェ
ル

カンペ⇒11_FTDIカーネルコンフィギュレーションとビ
ルド.txt

①$ANDROID/Embedded-MasterARM/kernel/armadillo440/arch/arm/configs/armadillo400_android_de
fconfigを別名コピー。(armadillo400_android_ensyu_defconfig)

マスタ タイトルの書式設定

[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440/arch/arm/configs
[host_pc~] >
cp␣armadillo400_android_defconfig␣armadillo400_android_ensyu_defconfig

②geditで直接編集。下記を追加。
[host_pc~] > gedit␣armadillo400_android_ensyu_defconfig
# USB port drivers
#
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_FTDI_SIO=y

③geditで保存して終了
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-265

265
実
習

カーネルコンフィギュレーションの
編集と適用と確認
カンペ⇒11_FTDIカーネルコンフィギュレーションとビ
ルド.txt

④makeコマンドでコンフィグレーション設定
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440
[host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-MasterARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi␣armadillo400_android_ensyu_defconfig

マスタ タイトルの書式設定

⑤カーネルコンフィギュレーション値が反映されたか「.config」をless
で確認しましょう
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440
[host_pc~] > less␣config
lessで開いて検索( 「/」キーのあとにキーワードを入れてリターン)し設定が反映され
ているかを確認する
# USB port drivers
#
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_FTDI_SIO=y
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-266

266
実
習

Androidカーネルイメージの作成

カンペ⇒11_FTDIカーネルコンフィギュレーションとビ
ルド.txt

⑥カーネルイメージ作成
[host_pc~] > make␣ARCH=arm␣CROSS_COMPILE=$ANDROID/Embedded-Master-

マスタ タイトルの書式設定

ARM/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

//カーネルのイメージファイル作成
[host_pc~] > gzip␣-c␣arch/arm/boot/Image␣>␣linux_training.ensyu_bin.gz

FTDIデバイスを組み込んだ
Androidのカーネルイメー
ジ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-267

267
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-268

268
実
習

ユーザランドのソースの修正

【環境】
開発用PCのLinuxシェル

カンペ⇒12_演習用ユーザランド作
成.txt

ユーザランド内で組み込んだデバイス(デバイスファイル名
「ttyUSB0」)にアプリケーションなどがアクセスできるよう
にします
① $ANDROID/system/core/init/devices.c

マスタ タイトルの書式設定

の構造体「perms_devperms[]」に以下の行を追加します
デバイスファイル「ttyUSB0」の追加とアクセス権限、uid、gidの設定を行っ
ています

static struct perms_ devperms[] = {
{ "/dev/null",
0666, AID_ROOT,
AID_ROOT,
0 },
{ "/dev/zero",
0666, AID_ROOT,
AID_ROOT,
0 },
{ "/dev/full",
0666, AID_ROOT,
AID_ROOT,
0 },
{ "/dev/ptmx",
0666, AID_ROOT,
AID_ROOT,
0 },
{ "/dev/tty",
0666, AID_ROOT,
AID_ROOT,
0 },
{ "/dev/tty0",
0660, AID_ROOT,
AID_SYSTEM,
0 },
{ "/dev/cam",
0660, AID_ROOT,
AID_CAMERA,
0 },
:
{ "/dev/ttyUSB0", 0666, AID_ROOT,
AID_ROOT,
0 },
{ NULL, 0, 0, 0, 0 },
};
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-269

269
Androidのユーザランドのビルド
カンペ⇒12_演習用ユーザランド作
成.txt

②ユーザランドのビルド

マスタ タイトルの書式設定

// Androidユーザランドのビルド
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/
[host_pc~] > echo␣"TARGET_PRODUCT:=armadillo440"␣>␣buildspec.mk
[host_pc~] > make␣-j2

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-270

270
実
習

ユーザランドのファイルシステム作成
カンペ⇒12_演習用ユーザランド作成.txt

③ Androidのルートファイルシステムに必要なファイル類を集め
る
[host_pc~] > cd␣$ANDROID
[host_pc~] > mkdir␣-p␣android-ensyu_root

マスタ タイトルの書式設定

[host_pc~] > cd␣$ANDROID/Embedded-MasterARM/out/target/product/armadillo440
[host_pc~] > cp␣-Rdpf␣root/*␣$ANDROID/android-ensyu_root
[host_pc~] > cp␣-Rdpf␣system/* $ANDROID/android—ensyu_root/system/

[host_pc~]
[host_pc~]
[host_pc~]
[host_pc~]
[host_pc~]

>
>
>
>
>

cd␣$ANDROID/android-ensyu_root
sudo␣chown␣-R␣root.root␣.
sudo␣chmod␣777␣-R␣system/usr/keychars
sudo␣chmod␣777␣-R␣system/usr/keylayout
sudo␣chmod␣777␣system/etc/dhcpcd/dhcpcd-run-hooks

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-271

271
実
習

固定IPアドレスの設定について

Androidのネットワーク設定は移植先のターゲットボードのルートファイル
システムにあるハードウェア専用の起動スクリプトinit.<hardware名>.rc
で設定されている
Armadillo440の場合 →
/init.armadillo440.rc
:

$ANDROID/ android-ensyu_root

on boot
コメントをはずす
setprop ro.sf.lcd_density 120
sudo gedit init.armadillo440.rc
setprop ro.radio.use-ppp no
setprop ro.radio.noril yes
setprop status.battery.state Slow#LAN
service␣lansetprop status.battery.level 5
setprop status.battery.level_raw setup␣/system/etc/init.armadillo440.sh
50
setprop status.battery.level_scale 9 oneshot
setprop net.eth0.dns1 8.8.8.8
setprop net.dns1 8.8.8.8
symlink /dev/snd/dsp /dev/eac
このシェルスクリ
chmod 0666 /dev/snd/dsp
write /sys/class/backlight/pwm-backlight/brightness
プトも確認(次
255

マスタ タイトルの書式設定

ページ)

#LAN
##service lan-setup /system/etc/init.armadillo440.sh
##
oneshot
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-272

272
実
習

固定IPアドレス設定
カンペ⇒02_固定IPアドレス設定.txt

④ 起動時に固定IPアドレスが設定されるようなシェルスクリプト
作成

//Androidのネットワーク設定ファイルに固定IPアドレスを設定しておく
[host_pc~] > cd␣$ANDROID/ android-ensyu_root
[host_pc~] > cd␣system/etc
[host_pc~] > sudo␣gedit␣init.armadillo440.sh

マスタ タイトルの書式設定

gedit起動、編集
#!/system/bin/sh
netcfg eth0 up
netcfg eth0 dhcp

#!/system/bin/sh
ifconfig␣eth0␣192.168.1.11
保存してgedit終了

//実行権限をつける
[host_pc~] > sudo␣chmod␣a+x init.armadillo440.sh

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-273

273
実
習

Androidファイルシステムの完成
カンペ⇒03_ファイルシステムの完
成.txt

⑤ Androidのルートファイルシステムのアーカイブ作成

//Androidユーザランドのファイルシステムをアーカイブにする
[host_pc~] > cd␣$ANDROID/android-ensyu_root
[host_pc~] > tar␣cvzf␣$ANDROID/rootfs_ensyu_training.tar.gz .
[host_pc~] > cd␣$ANDROID
[host_pc~] > ls

マスタ タイトルの書式設定

Embedded-Master-ARM␣rootfs_ensyu_training.tar.gz␣androidensyu_root␣
rootfs_a_training.tar.gz␣android-root

FTDIデバイスを組み込んだ
Androidのユーザランドのファイルシス
テム
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-274

274
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-275

275
4章の実習完了後のメモリの状態
【接続環境】
開発用PC ⇔ Armadillo-440(RS232Cケーブ
ル)
JP2ショート状態(hermit起動モード)

[armadillo] hermit>
setenv
console=ttymxc1
root=/dev/mmcblk0p2
init=/init
noinitrd
rootwait
[armadillo] hermit> boot

開発用PC

C-Kermit
シリアル通信ソフ
ト

マスタ タイトルの書式設定
Armadillo-440
NOR Flashメモリ(32M)

linux_training_.bi
n.gzをRAMに
ロードして実行

組み込み済み

現在はこの状態

bootloader

ブートローダ領域(Hermit)

SDカード内の
Androidで起動

Android対応kernel
Linuxカーネル領域

userland

microSD

/dev/mmcblk0p1

Androidの
ルートファイル
システム

/dev/mmcblk0p2

Linuxユーザランド領域

config
Linuxカーネルパラメータ保存領域
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

Androidが起動
5-276

276
実
習

ユーザランドの差し替えをするので
通常Linuxのカーネルに戻す

【接続環境】
開発用PC ⇔ Armadillo-440(RS232Cケーブル)
JP2ショート状態(hermit起動モード)
カンペ⇒05_製品版Linuxのブート手
順.txt

[host_pc~] $ cd␣~/work/atmark
[host_pc~] $ hermit␣download␣--input-file␣linux-a400-1.06.bin.gz␣--region␣kernel␣--port␣

マスタ タイトルの書式設定

/dev/ttyUSB0

Armadillo-440
NOR Flashメモリ(32M)

開発用PC

bootloader
ブートローダ領域(Hermit)

kernel

hermit

Linuxカーネル領域

Armadillo用
ブートローダ兼ダウンロー
ダ

userland
Linuxユーザランド領域

config
Linuxカーネルパラメータ保存領域

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-277

277
実
習

通常Linuxのカーネルで起動

【接続環境】
開発用PC ⇔ Armadillo-440(RS232Cケーブル)
JP2ショート状態(hermit起動モード)

開発用PC

カンペ⇒05_製品版Linuxのブート手順.txt

[armadillo] hermit>
clearenv
[armadillo] hermit>
setenv
Armadillo-440
[armadillo] hermit> boot
NOR Flashメモリ(32M)

C-Kermit
シリアル通信ソ
フト

マスタ タイトルの書式設定
linux-a400-1.06.bin.gz
をRAMにロードして実行

/dev/mmcblk0

bootloader

microSD

ブートローダ領域(Hermit)

kernel
Linuxカーネル領域

×

Androidの
ルートファイル
/dev/mmcblk0p2
システム

userland
Linuxユーザランド領域

linux-romfsをマウント
各プロセスの実行

config
Linuxカーネルパラメータ保存領域

通常Linuxが起動
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-278

278
実
習

演習用Android RootfsをArmadillo-440へ転送

【接続環境】
開発用PC ⇔ Armadillo-440(RS232Cケーブル)
開発用PC ⇔ Armadillo-440(LANケーブル)
JP2ショート状態(hermit起動モード)

開発PC

armadillo440

マスタ タイトルの書式設定
FTP

/home/ftp/pub/

カンペ⇒07_Android RootFSのFTP転送.txt

rootfs_ensyu_training.tar.gz
192.168.1.10

192.168.1.11

[host_pc~] > cd␣$ANDROID
[host_pc~] > ftp␣192.168.1.11
login name:ftp
login password:なし
ftp> cd␣pub
ftp> bin
ftp> put␣rootfs_ensyu_training.tar.gz
ftp> bye
[host_pc~] >
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-279

279
実
習

演習用Android RootfsをmicroSDに展開
Armadillo440の/home/ftp/pubからAndroidのユーザラ
ンドのファイルシステムをmicroSDカードのパーティ
ション2(mmcblk0p2)に展開します

マスタ タイトルの書式設定

カンペ⇒13_演習用Android RootFSをmicroSDに展開.txt

[armadillo ~] # mount␣/dev/mmcblk0p2 /mnt

//microSDのパーティション2に

マウント
[armadillo ~] # rm –rf /mnt/*
//マウント配下の
ファイルやディレクトリを削除 [armadillo ~] # cd␣/home/ftp/pub
//ftpで転送したRootfsのある場所へ
[armadillo ~] # mv␣rootfs_ensyu_training.tar.gz␣/mnt/. //マウント配下にRootfsを
移動
[armadillo ~] # cd␣/mnt
//マウント
ディレクトリへ
[armadillo ~] # tar␣xzvf␣rootfs_ensyu_training.tar.gz
// Rootfsを展開
[armadillo ~] # rm␣–rf␣lost+found
//不要なフォルダの
削除
[armadillo ~] # rm␣–rf␣rootfs_ensyu_training.tar.gz
//tarファイルも削除
[armadillo ~] # cd␣..
5-280 //マウント
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.
280
ディレクトリから抜ける
実
習

製品版Linuxのrebootとkermit切断
[armadillo ~] # reboot
[armadillo ~] #
System is going down for system reboot now.

Starting local stop scripts.
Exiting Syslogd!
Syncing all filesystems:
done
Unmounting all filesystems:
done
The system is going down NOW !!
Sending SIGTERM to all processes.
Please stand by while rebooting the system.
Hermit-At v2.0.8 (armadillo4x0) compiled at 15:29:17, Nov 12 2010
hermit> <ctrl+→ctrl+c> //ショートカットキー
(Back at ubuntu-vm)
---------------------------------------------------(/home/aj741327/) C-Kermit> q
Closing /dev/ttyUSB0...OK
[host_pc~] >

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-281

281
実
習

デバイスを組み込んだAndroid用カーネルを書き込む

【接続環境】
開発用PC ⇔ Armadillo-440(RS232Cケーブル)
JP2ショート状態(hermit起動モード)
カンペ⇒14_演習用Androidブート手順.txt

# Armadillo440用の標準カーネルをAndroidのLinuxカーネルで上書きします
[host_pc~] > cd␣$ANDROID/Embedded-Master-ARM/kernel/armadillo440
[host_pc~] > hermit␣download␣--input-file␣linux_training_ensyu.bin.gz␣--

マスタ タイトルの書式設定

region␣kernel␣
--port␣/dev/ttyUSB0

Armadillo-440
NOR Flashメモリ(32M)

開発用PC

bootloader
ブートローダ領域(Hermit)

Android対応kernel

hermit

Linuxカーネル領域

Armadillo用
ブートローダ兼ダウンロー
ダ

userland
Linuxユーザランド領域

config
Linuxカーネルパラメータ保存領域
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-282

282
実
習

デバイスを組み込んだ新Androidで起動

【接続環境】
開発用PC ⇔ Armadillo-440(RS232Cケーブル)
JP2ショート状態(hermit起動モード)

開発用PC

カンペ⇒14_演習用Androidブート手順.txt

[armadillo] hermit>
setenv␣console=ttymxc␣root=/dev/mmcblk0p2␣init=/init␣noinitrd␣ rootwait
[armadillo] hermit> boot

C-Kermit
シリアル通信ソ
フト

マスタ タイトルの書式設定
Armadillo-440
NOR Flashメモリ(32M)

linux_training_ensyu.b
in.gzをRAMにロードして
実行

組み込み済み

bootloader

ブートローダ領域(Hermit)

SDカード内の
Androidで起動

Android対応kernel

/dev/mmcblk0
microSD

Linuxカーネル領域

userland

Androidの
ルートファイル
システム

/dev/mmcblk0p2

Linuxユーザランド領域

config
Linuxカーネルパラメータ保存領域
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

新Androidが起動
5-283

283
実
習

新Android起動後の確認事項

【接続環境】
ここでは
作業用PC ⇔ Armadillo-440(RS232Cケーブル)
から下記に変更する
開発用PC ⇔ Armadillo-440(LANケーブル)

ネットワーク設定の確認をします
[Android] # netcfg
lo UP
127.0.0.1
255.0.0.0
eth0
UP
192.168.1.11

マスタ タイトルの書式設定
0x00000049
255.255.255.0. 0x00001043

※上記のIPアドレスが設定されていない場合は「ifconfig eth0 192.168.1.11」を手
打ち
で実行して設定してください。

IPアドレスの設定確認終了後
①ckermitでの接続を切断(Androidのプロンプトで[ctrl+→ctrl+c] ⇒
[q])
②RS232CケーブルをArmadilloからはずす
③LANケーブルで開発用PCと接続
④開発用PCのコマンドプロンプトからpingを投げてネットワークの接続の確
認
5-284
This material is licensed under the Creative Commons
⑤adb shell 起動
License BY-NC-SA 4.0.

284
実
習

新Android起動後の確認事項

【接続環境】
開発用PC ⇔ Armadillo-440(LANケーブル)

Armadillo-440のUSBポートに「USBシリアル変換ケーブル」を抜き挿ししてデ
バイス
ファイル「ttyUSB0」があるか確認します

マスタ タイトルの書式設定

①Armadillo-440に挿入前
[Android] # ls␣/dev/tty*
:
/dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3
/dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 / dev/tty6

②Armadillo-440に挿入後
[Android] # ls␣/dev/tty*
:
/dev/tty15 /dev/tty26 /dev/tty37 /dev/tty48 /dev/tty59 /dev/ttyS3
/dev/tty16 /dev/tty27 /dev/tty38 /dev/tty49 /dev/tty6 /dev/ttyUSB0

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-285

285
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-286

286
実
習

新規NDKアプリケーションProject作成
【Application Name】
BarcodeReader
【Project Name】
BarcodeReader
【Package Name】
jp.oesf.ensyu

Ecripse⇒File > New >
Project

マスタ タイトルの書式設定

【Build Target】
Android 2.2 (API level
8)

チェックをはずす

「Android Application Project」選択して「Next」

必要な設定項目を入力して「Next」
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-287

287
実
習

新規NDKアプリケーションProject作成

マスタ タイトルの書式設定
「Create Activity」にチェックをつけて「Next」
TitleはApplication名に変更して「Finish」

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

「BarcodeReader」という新規の
プロジェクトが完成
(ここまでは通常のAndroidアプ
リケーションのプロジェクトで
す)
5-288

288
実
習

新規NDKアプリケーションProject作成

マスタ タイトルの書式設定

作成するJNI用の共有ライブラ
リ名「serial-barcode」を入
力して
プロジェクト名を右クリックして
「Finish」
「Andoroid Tools」⇒「Add Native Support」選択

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

プロジェクトにjniフォル
ダとobjフォルダが追加さ
れる
Jniフォルダには最小限の
設定が書かれたAndroid.mk
が自動生成される
5-289
実
習

新規NDKアプリケーションProject作成

マスタ タイトルの書式設定

今回は単一解像度の実機しか用いないのでdrawableフォルダの不要なフォルダを削除してください
drawable-hdpi、drawable-ldpi、drawable-xdpiを選択して「Delete」
※プロジェクトの構造を見やすくするため

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-290
実
習

ソースコードの配置(リソースファイル)
本実習で使用するコードをプロジェクト内に配置(コ
ピー)
●デスクトップ/resource_of_res/drawable-mdpi
●デスクトップ/resource_of_res/layout
→ res/配下に上書きコピー

マスタ タイトルの書式設定
コピー

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-291
実
習

ソースコードの配置(Javaのソースコード)
本実習で使用するコードをプロジェクト内に配置(コ
ピー)
●デスクトップ/source_of_java/MainActivity.java
●デスクトップ
/source_of_java/OnSerialListener.java
●デスクトップ/source_of_java/RxtxSerial.java
→ jp.oesf.ensyuパッケージ配下に上書きコピー

マスタ タイトルの書式設定
コピー

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-292
実
習

ソースコードの配置(ネイティブのソースコード)
本実習で使用するコードをプロジェクト内に配置(コ
ピー)
●デスクトップ/source_of_native/logdebug.h
●デスクトップ/source_of_native/serial-barcode
→ jniフォルダ配下にコピー

マスタ タイトルの書式設定
コピー

jniフォルダ配下にserial-barcode.cppというC++のコード
ファイル
がありますが今回はCで開発するので削除してかまいませんCommons
This material is licensed under the Creative
License BY-NC-SA 4.0.

5-293
ソフトウェア構成図
MainActivity.java
OnSerialListener.
java
アプリ
画面

アプリケーション
Home

Contacts

Phone

Browser

アプリケーションフレームワーク
アクティビティ
マネージャ

ウィンドウ
マネージャ

コンテンツ
プロバイダ

ビューシステム

通知マネージャ

パッケージ
マネージャ

電話
マネージャ

リソース
マネージャ

位置
マネージャ

XMPP
サービス

マスタ タイトルの書式設定
RxtxSerial.jav
シリアル通信
マネージャ

JNI

a

シリアル
インタフェース
ライブラリ

ライブラリ

Androidランタイム

サーフェス
マネージャ

メディア
フレームワーク

SQLite

コアライブラリ

OpenGL | ES

FreeType

WebKit

Dalvik
仮想マシン

SGL

SSL

Libc

HARDWARE ABSTRACTION LAYER

serialbarcode.c

WiFi

Audio

Camera

Radio(RIL)

・・・

ディスプレイ
ドライバ

Bluetooth
ドライバ

カメラドライバ

フラッシュメモリ
ドライバ

バインダ(IPC)
ドライバ

キーパッド
ドライバ

USBドライバ

WiFiドライバ

オーディオ
ドライバ

電源管理

Graphics

Linuxカーネル 2.6
USBシリアル
ドライバ
(FTDI)

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-294

294
実
習

Android.mkの編集
BarcodeReader/jni/Android.mkを編集します
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

マスタ タイトルの書式設定

LOCAL_MODULE
:= serial-barcode
LOCAL_SRC_FILES := serial-barcode.cpp
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE
:= serial-barcode バーコードリーダを制御するネイティブモジュー
ル名
LOCAL_SRC_FILES := serial-barcode.c
バーコードリーダを制御するネイティブライブラリのソー
LOCAL_LDLIBS := -llog
スコード
include $(BUILD_SHARED_LIBRARY)
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-295

295
JNIインタフェース
本アプリケーションでバーコードリーダを制御するために必要なJava側のJNIインタフェ
ース
はRxtxSerial.javaで定義されています。
RxtxSerial.java
//ネイティブモジュール(.so)のロード
static {
System.loadLibrary("jniserial");
}
//シリアルデバイスに接続
public native int openComm(String dev, boolean debug);
//シリアルデバイスから切断
public native void closeComm();
//シリアルデバイスに接続時のパラメータ設定
private native boolean setCommParams(int baudRate, int dataBits,int stopBits, int parity);
//ネイティブに自インスタンスを渡す
protected static native void setListener(RxtxSerial rxtxSerial);
//ネイティブで動いているスレッドを明示的に止める
protected static native void stopReadThread();

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-296

296
実
習

JNIヘッダファイルの生成

①JNIインタフェースが定義されたヘッダファイルを作成します
AndroidのJavaのコードのコンパイル結果(.classファイル)は<Project>/bin/classes配下に
存在します。
JDKのjavahコマンドでJNIヘッダファイルの生成とプロジェクトのjniディレクトリへの配置を
行います。
カンペ⇒15_JNIヘッダファイル作
成.txt

[host_pc~]
[host_pc~]
[host_pc~]
Android.mk

$ cd␣~workspace/BarcodeReader //アプリケーションのプロジェクト
$ javah␣-classpath␣bin/classes␣-d␣jni␣jp.oesf.ensyu.RxtxSerial
$ ls␣jni
serial-barcode.c logdebug.h jp_oesf_ensyu_RxtxSerial.h

マスタ タイトルの書式設定

②Eclipseにてプロジェクト名を右クリックし、「Refresh」を行うことで、Eclipse内のパッ
ケージ構成にも
作成したヘッダファイルが表示されます

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-297

297
実
習

JNIヘッダファイルの生成

③EclipseにてBarcodeReader/jni/serial-barcode.cを開き以下のヘッダのincludeを追記
します

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-298
参
考

コード概要(MainActivity.java)
MainActivity.javaではバーコードで読み取ったコードを表示する画面の実装をし
ています

//ActivityクラスにOnSerialListenerインタフェースを実装する
public class MainActivity extends Activity implements OnSerialListener {
@Override
public void onCreate(Bundle savedInstanceState) {
:
RxtxSerial sp = new RxtxSerial();
// シリアルポートオープン
int devStatus = sp.openComm(SERIAL_PORT, true);
//シリアル通信パラメータのセット
sp.setCommMode(BAUDRATE, DATABITS_8, STOPBITS_1, PARITY_NONE);
//シリアルライブラリに自インスタンスを渡して受信待ち開始
sp.setOnSerialListener(this);
:
}
//バーコードが読み取ったコード受信用メソッド
main_activity.xmlで定義されたレイア
@Override
ウト

マスタ タイトルの書式設定

public void onReceive(String id) {
//idの値により、画面に表示するコンテンツを選択、表示
}

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-299
参
考

コード概要(RxtxSerial.java)

RxtxSerial.javaは実際にネイティブライブラリを呼び出しり、Androidアプリケーションの画面
とのやりとりを
行うインタフェースの実装も行っています
// イベントリスナーの登録関数
public void setOnSerialListener(OnSerialListener serialListener) {
this.mSerialListener = serialListener;
setListener(this);

//MainActivityのインスタンスを保持しておく

//ネイティブに自身のインスタンスを渡す

マスタ タイトルの書式設定

// MainActivityとやりとりをするためのハンドラを生成
mHandler = new Handler() {

public void handleMessage(Message msg) {
// ハンドラでUIに読み取りコードの値を渡す
mSerialListener.onReceive((Integer) msg.obj);
:

またネイティブからコールバックされるメソッドが実装されています
// JNIからコールされるコールバック関数
protected static void callBackFromJNI(String code) {
Message msg = new Message();
msg.obj = code;
mHandler.sendMessage(msg);
// 読み取りコードの値をハンドラに渡す
}
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-300

300
参
考

コード概要(serial-barcode.c)
Serial-barcode.cはJavaから呼ばれるJNI関数を実装しています

ネイティブログの出力
#include "logdebug.h"
//ログ出力例
LOGD_IF(debug, "JNI: +setListener");
LOGD_IF( debug, "JNI: openPort: Device Open...: %s", port);

マスタ タイトルの書式設定

デバイスファイルのオープン
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
static int fd = 0;
JNIEXPORT jint JNICALL Java_jp_oesf_ensyu_RxtxSerial_openComm (
JNIEnv *env, jobject obj, jstring dev, jboolean debug_flag) {
// シリアルのオープン(読み取り専用)してファイルディスクリプタを受け取る
fd = open(port, O_RDONLY);
:

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-301

301
参
考

本実習のネイティブコード概要解説
シリアル通信用パラメータの設定
#include <termios.h>
struct termios oldtio, newtio; /* 通信設定構造体 */
JNIEXPORT jboolean JNICALL Java_jp_oesf_ensyu_RxtxSerial_setCommParams(
JNIEnv *env, jobject obj, jint baudrate, jint databits, jint
stopbits,jint parity){
//制御モード(シリアル通信の制御全般の設定)
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
//入力モード(入力された文字に対して行う設定)
newtio.c_iflag = IGNPAR | ICRNL;
//出力モード(出力する文字jに対して行う処理)
newtio.c_oflag = 0;
//ローカルモード(通信先に影響のない設定)
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN] = 1;
newtio.c_cc[VTIME] = 0;

マスタ タイトルの書式設定

cfmakeraw(&newtio);
cfsetospeed(&newtio, BAUDRATE);
cfsetispeed(&newtio, BAUDRATE);
/* 設定上書き(即座に) */
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-302

302
参
考

本実習のネイティブコード概要解説
Javaへのコールバックメソッドのmid取得とデータ受信用スレッド生成
#include <pthread.h>
void *readThread(void *arg); /* シリアル入力データ受信用のスレッド */
jmethodID mid;
jclass mClass;
jobject mObject;

マスタ タイトルの書式設定

JNIEXPORT void JNICALL Java_jp_oesf_ensyu_RxtxSerial_setListener (
JNIEnv *env, jclass clazz, jobject obj) {
:
//JavaへのコールバックメソッドIDの取得
jclass claz = (*env)->GetObjectClass(env, obj);
mClass = (jclass) (*env)->NewGlobalRef(env, claz);
mObject = (*env)->NewGlobalRef(env, obj);//グローバル参照取得
mid = (*env)->GetStaticMethodID(env, clazz, "callBackFromJNI", "(I)V");
:
// バーコードからの信号受信待ちのスレッドを生成
pthread_t thread_;
int status = pthread_create(&thread_, NULL, readThread, NULL);
:

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-303

303
参
考

本実習のネイティブコード概要解説
データ受信用スレッド
void *readThread(void *arg) {
:
//JavaにコールバックするためにJavaVMのJNIEnvを取得してこのスレッドにアタッチさせる
status = (*gJavaVM)->AttachCurrentThread(gJavaVM, &env, NULL);
:
// 受信データ入力待ちの間ループ
while (!STOP) {
res = read(fd, &c, 1);
:
switch((unsigned char)c){
case 0x0C: //データの始まり
break;
case 0x0D: //データの終わり
*pos = '0';
//文字列をjstringにする
jstring result = (*env)->NewStringUTF(env, buf);
//Androidアプリの画面に読み取った文字列をコールバックする
(*env)->CallStaticVoidMethod(env, mClass, mid, result);
pos = buf;
break;
default:
if((pos - buf) < size){
*pos++ = c;
}
break;

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-304

304
参
考

readThread(void)の処理

シリアル通信
マネージャ

③JavaメソッドにString型でコールバック

マスタ タイトルの書式設定

JNI

シリアル
インタフェース
ライブラリ

/dev/ttyUSB0

有効なコードか判定

Buf[1024]
41
②開始”0C”受信後から
終了”0D”受信までの
バイトデータをバッファに詰め込む

9 2 1

・・・

①バーコードリーダから1byteずつデータを
受信

USBシリアル
ドライバ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-305

305
参
考

本実習のネイティブコード概要解説
デバイス切断
JNIEXPORT void JNICALL Java_jp_oesf_ensyu_RxtxSerial_closeComm (JNIEnv *env,
jobject obj) {
:
// グローバル参照を削除
if (mObject != NULL) {
(*env)->DeleteGlobalRef(env, mObject);
}
mObject = NULL;
// 強制中断のためにSIGINTを送信
raise(SIGINT);
// 保管しておいた設定を元に戻す
ioctl(fd, TCSETS, &oldtio);
// シリアルデバイスのクローズ
close(fd);
// readThreadからデタッチ
if (isAttached) {
(*gJavaVM)->DetachCurrentThread(gJavaVM);
LOGD_IF(debug, "JNI: DetachCurrentThread DONE");
}
:

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-306

306
実
習

NDKアプリ「BarcordReader」のビルド
プロジェクト名を選択して右ク
リック

マスタ タイトルの書式設定
「Build Project」実行

「Build が成功すると「libs」配下に
ライブラリが作成される
同時にAndroidアプリケーションの実
行ファイルであるapkも作成される
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-307
実
習

「BarcordReader」のアプリケーション
動作確認準備
ホストPCのシェルからadbサーバを起動してarmadillo-440とadb接続する
[host_pc~] > adb␣kill-server
[host_pc~] > adb␣start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
[host_pc~] > adb␣devices
List of devices attached
emulator-5554 device

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-308

308
実
習

NDKアプリ「BarcordReader」の
インストール
Eclipseのメニューボタン(実
行)

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-309
実
習

NDKアプリ「BarcordReader」の
インストール
適当に名前をつける

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-310
実
習

NDKアプリ「BarcordReader」の
インストール・実行

実機選択

マスタ タイトルの書式設定

Armadillo-440上で起動した「BarcodeReader」
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-311

311
実
習

動作確認
①バーコードリーダー
アプリ起動
シリアル

Armadillo-440 ACアダプタクロスケーブル
( Android 2.2)

給電用USB

開発用PC

マスタ タイトルの書式設定
バーコードリー
USB-RS232C
変換ケーブル

ダー
USB
RS232C
LANケーブル

③書籍情報表示

②書籍バーコード
をタッチ!

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-312

312
余力のある人向け
デバッグ
Logcatを見る
DDMSを見る
Eclipseのデバッガを使用してJavaのコード内のトレー
スをする
gdbでネイティブコードのステップ実行を行う
Trace Viewを使ってみる

マスタ タイトルの書式設定

Androidの応用
画面のデザインを変えてみる
実際に読み込んだJANコードの商品名を取得できるよう
なWebサービス(楽天など)と連携してみる
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-313

313
まとめ
以上でプラットフォーム編の研修は終了です。
お疲れ様でした。
AndroidはベースはLinuxだから移植も組み込みも簡単と思われがちですが、
意外とAndroidに特化したところも多いので、今回学んだことも含めて、
再度ソースコードのトレースなどで各機能を理解することをお勧めします。

マスタ タイトルの書式設定

Androidの開発を行うには、今までの下回りの知識だけではなく、Javaの知
識や
JNIの知識もとても重要です。
この研修を機に、新たな領域におけるスキルを身につけましょう。
他にも様々なハードウェアデバイスをAndroidが動作しているArmadillo440
に組み込んで、新しいサービス、新しいアプリケーションを考えてみませ
んか?

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-314

314
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-315

315
参考資料
マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-316

316
参
考

アプリケーション開発環境事前確認
JDK6はインストールされているか?
$ java –versionで確認しましょう

×

java version "1.5.0_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02)
Java HotSpot(TM) Client VM (build 1.5.0_19-b02, mixed mode, sharing)

マスタ タイトルの書式設定

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)

No!(Javaそのものがない)→JDK6をインストールしま
しょう
Oracleのサイトから「jdk-6u43-linux-i586.bin」をダウンロード
してテキストに
あるJDK5のインストール方法と同様にインストールしましょう。
http://www.oracle.com/technetwork/java/javase/downloads/jdk
6downloads-1902814.htmlis licensed under the Creative Commons
5-317
This material
Copyright 2009-2012, Open Embedded Software Foundation, All rights reserved
License BY-NC-SA 4.0.

317
参
考

アプリケーション開発環境事前確認
-No!(バージョンが1.5)→使用するJDKを6に変更
下記コマンドで変更します

$ sudo␣update-alternatives␣--config␣java

マスタ タイトルの書式設定
There are 2 choices for the alternative java (providing
/usr/bin/java).
選択肢
パス
優先度 状態
-----------------------------------------------------------0
/usr/lib/jvm/java-6-sun/jre/bin/java
63
自動モード
* 1
/usr/lib/jvm/java-1.5.0-sun/jre/bin/java 53
動モード
2
/usr/lib/jvm/java-6-sun/jre/bin/java
63
手動モード
現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号の
5-318
This
under the Creative
キーを押してください: 0material is licensed BY-NC-SA 4.0. Commons
License

手

318
参
考

アプリケーション開発環境事前確認
AndroidSDKがインストールされている?
$ ls ~/android/android-sdk-linux
No!→4章の手順を参考にインストールしましょう

AndroidNDKがインストールされている?
$ ls ~/android/android-ndk-r8b
No!→6章の手順を参考にインストールしましょう

マスタ タイトルの書式設定
Eclipseがインストールされている?

$ ls ~/eclipse(indigo)
No!→6章の手順を参考にインストールしましょう

ADTがEclipseにインストールされている?
Eclipseを起動してavd manager ボタンやddmsなどがあることを確
認
Android Native Developemt Toolsがあることも確認
No!→6章の手順を参考にインストールしましょう

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-319

319
参
考

アプリケーション開発環境事前確認
EclipseにAndroidのSDKのロケーションが設定されてい
る?
Eclipse>Window>Preferences>Android
No!→ SDK LocationにSDKのパスを設定しましょう

マスタ タイトルの書式設定

EclipseにAndroidのNDKのロケーションが設定されてい
る?
Eclipse>Window>Preferences>Android>NDK
No!→NDK LocationにNDKのパスを設定しましょう

Eclipseの各種設定は終わっているか?
プロジェクトのテキストエンコードがutf8、Javaのコンパイラが
1.6になっているか確認
No!→Eclipseの環境設定ダイアログで設定しましょう

Android2.2のプラットフォームがインストールされてい
る?
Android SDK ManagerでAndroid2.2(API8)のSDK Platformが
5-320
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.
installedになっているか確認

320
参
考

アプリケーション開発環境事前確認
ローカルのシェル設定ファイルに環境変数が登録されてい
る?
$ cd | less .bashrc で確認
• export
tools
• export
• export
• export

PATH=${PATH}:~/android/android-sdk-linux/platform-

マスタ タイトルの書式設定
PATH=${PATH}:~/android/android-sdk-linux/tools
ADBHOST=192.168.1.11
PATH=${PATH}:~/android/android-ndk-r8b

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-321

321
参
考

ライセンス
GPL(GNU General Public License )
GNUプロジェクトで開発されたソフトウェアや、その派生物を使用した際はソフトウェアはソー
スコードの公開が原則とされている
ソースコードの著作権は永久に伝播する

LGPL(GNU Lesser General Public License )
GPLをベースとしているが、LGPLの元で公開されたソースを利用したソフトウェアを開発しても
、その独自開発部分のソースコードの公開を強制しない
LGPLの元で公開されたソースコードを改変して利用した場合には、その部分のソースコードは
公開しなければならないとされている

マスタ タイトルの書式設定
BSD(Berkeley Software Distribution License)

「無保証」であることの明記と著作権およびライセンス条文自身の表示を再頒布の条件とする
ライセンス規定。
この条件さえ満たせば、BSDライセンスのソースコードを複製・改変して作成したオブジェクト
コードを、ソースコードを公開せずに頒布できる。
著作権表示、ライセンス条文、無保証の旨の三点をドキュメント等に記載さえしておけば、BSD
ライセンスのソースコードを他のプログラムに組み込み、しかも組み込み後のソースコード
を非公開にできる。

apache 2.0
ユーザーがそのソフトウェアの使用/頒布/修正、派生版の頒布をすることを制限しない。
要求するのは、ユーザーがそのソフトウェアに Apache License のコードが使われていること
を知らせる文言を入れることだけである。
ライセンスされたファイルそれぞれに元々ある著作権と特許権の記述はそのまま保持されなけ
ればならず、何らかの修正が施されている場合は、その旨を追加記述しなければならない。
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-322

322
参
考

Proxy環境での各種設定(1)
EclipseのADT Pluginインストール/アップデートに失敗する場合
①
http://developer.android.com/intl/ja/sdk/eclipse-adt.htmlから
ADT-x.x.x.zipをDLする
②
「Help」→「Install New Software」→「Add」siteダイアログで
Archiveを選択し①のzipファイルを指定する
③
「Next」でインストールを開始する

マスタ タイトルの書式設定

EclipseのADT PluginにてSDK Componentのインストールに失敗する場合
①
「AndroidSDKのインストール先android-sdk-linuxtoolsandroid」を実
行
②
「tools⇒Options」でSettingsダイアログを開きProxyサーバ情報を入力
し、Miscにある項目にチェックをいれる
③
EclipseのADTPluginにてリトライ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-323

323
参
考

Proxy環境での各種設定(2)
アップデートマネージャ使用時やapt-getコマンドでパッケ
ージを取得する場合
/etc/apt/apt-confにproxy設定を記述
Acquire::ftp::proxy "ftp://username:password@your.proxy.address:8080/";
Acquire::http::proxy "http://username:password@your.proxy.address:8080/";
Acquire::https::proxy "https://username:password@your.proxy.address:8080/";

マスタ タイトルの書式設定

Curlツールでrepoを取得する際のproxy認証のオプション
$ curl -U username:password -x your.proxy.adress:8080

gitのポート開放:TCP9418

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-324

324
参
考

init.rcのAction解説
<trigger> の種類

init.rc

boot
propname=value

on <trigger>

<command>
<command>
:

SERVICE部

プロパティ(propname)に値(value)が設
定されたときに発生するトリガー

device-added(またはremoove)-<path>

ACTION部

Initが起動したときに発生するトリガー

デバイスノードが追加または削除された
ときに発生するトリガー

マスタ タイトルの書式設定
service-exited-<name>

サービスが終了したときに発生するトリ
ガー

<command> の種類

class_start <class name>
class_stop <class name>
import <path>

<class name>に属するserviceの
startまたはstopを一括指定

pathでされた*.rcファイルをパ
ース

Exec <path> [<argument>]*

Forkして<path>で指定したプログラムを実行(
非推奨)

export <name> <value>

グローバル環境変数設定

ifup <interface>

Interfaceをオンラインに

hostname <name>

ホスト名設定

insmod <path>

モジュールを<path>にインスト
ール

copy <from path> <to path>

ファイルコピー

trigger <target define>

target defineに指定したトリガーを実施

setprop <name> <value>

nameのプロパティにvalueを設定
する

chdir <directry>

作業ディレクトリ変更

chmod <octal-mode> <path>

パーミッション付与

chown <owner> <group>

<path>

ファイルのオーナーとグループ
の変更

chroot <directry>

プロセスのルートディレクトリ変更

loglevel <level>

3=ERROR, 5=NOTICE, 6=INFO

デバイスファイル登録指定
sourceは”/dev/hoge” や“/dev/fuga* “のよ
<permission> <uid> <gid>
5-325
This material is licensed under the Creative Commonsうに書く
device <source>

License BY-NC-SA 4.0.

325
参
考

init.rcのService解説
init.rc
ACTION部

:
SERVICE部
service <service> <path> [argument]*

[option]

マスタ タイトルの書式設定
<option>
<option>
:

<option> の種類
capability

class

oneshot
onresta
rt

console

サービスが再起動したときにコマンドを
実行

setenv

クラス名付与

サービスが終了した際に再起動しない

プロセス起動時に環境変数に値付与

critical

4分間に4回以上終了してしま
った場合リカバリーモードで起
動

socket

disabled

自動起動不可。明示的に起動

user

keycodes

Rootではなく指定のuserアカウントでサ
ービスを実行

Ioprio
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-326

326
参
考

init.rcのService解説
<service> の種類
サービス名

機能

ファイルシステム

ソースコード

console

Console

/system/bin/sh

adbd

Android Debug Bridge Daemon

/system/adbd

servicemanager

Binder Context Manager

/system/bin/servicemanager

vold

Volume Manager

/system/bin/vold

system/vold

Netlink Manager

/system/bin/netd

system/netd

debuggerd

Debugger Daemon

/system/bin/debuggerd

system/core/debuggerd

ril-daemon

Radio Interface Layer Daemon

/system/bin/rild

hardware/ril/rild

zygote

Zygote

/system/bin/app_process

frameworks/base/cmds/app_
process

media

Media Server

/system/bin/mediaserver

frameworks/base/media/med
iaserver

netd

system/core/adb
frameworks/base/cmds/serv

icemanager

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-327

327
参
考

ソースコード詳細(external)
external
外部プロジェクトは外部のオープンソースプロジェクトから移植されたコードです
携帯端末搭載用のモジュールと開発環境で使用するモジュールが含まれてます
Apache提供のhttpアクセスライブラ
リ

embunit

Android STLライブラリ(標準
C++STLの最適化版)

emma

3Dグラフィックス用プラットフォー
ム

Bisonパーサ

esd

サウンドデーモン

blktrace

ブロックIOトレースライブラリ

expat

XMLパーサ

bluetooth

Bluetoothプロトコルスタック

fdlibm

算術演算ライブラリ

bsdiff

バイナリファイルのパッチ生成

freetype

フォント関連ライブラリ

bzip2

データ圧縮アルゴリズム

fsck_msdos

fatファイルシステムのチェッカー

clearsilver

C言語によるテンプレートエンジン

genext2fs

ext2ファイルシステムイメージ作成

dbus

プロセス間通信(IPC)ライブラリ

giflib

GIF画像操作ライブラリ

dhcpcd

DHCPプロトコルデーモン

grub

ブートローダー

dnsmasq

簡易DNSキャッシュサーバプログラ
ム

gtest

google-testテストフレームワーク

dropbear

SSH2用サーバとクライアント

guava

googleのjava1.6向けコアライブラ
リ

e2fsprogs

ext2,3,4のメンテナンスユーティリ
ティ

icu4c

国際化ライブラリ

apache-http
astl

bison

easymock

組込C言語向けテストユニットフレ
ームワーク

マスタ タイトルの書式設定

ユニットテストツール

パケットのルーティングテーブル操
5-328

This material is licensediproute2
under the Creative Commons
作
License BY-NC-SA 4.0.

328
参
考

ソースコード詳細(external)
external
jdiff

javadocの差分ツール

jhead

jpegのExif情報操作ツール

jpeg

静止画像圧縮方式

jsr305

アノテーション標準セット

junit
kernelheaders
libffi

oprofile

システム全体のプロファイリングツ
ール

ping
ppp

PPPプロトコルデーモン

proguard

javaクラスファイル難読化ツール

qemu

Androidエミュレータプログラム

quake

quakeエンジン

safe-iop

整数(int)のオーバーフロー抑止

skia

グラフィックエンジン

sonivox

midi再生エンジン

speex

VoIPの音声圧縮コーデック

sqlite

データベースライブラリ

srec

音声認識エンジン

マスタ タイトルの書式設定
javaのユニットテストツール

Linux kernelのヘッダファイル

低レイヤ用の外部関数インタフェース
ライブラリ

libpcap

ユーザレベルパケットキャプチャ

libpng

PNG画像解析用ライブラリ

libxml2

XMLパーサ

mtpd

メディア転送プロトコル

netcat

ネットワーク通信ユーティリティ

netperf

ネットワークパフォーマンス計測ユー
ティリティ

stlport

標準STLにはないハッシュ、単方向
リスト、ロープクラスなどを含む
STL

neven

画像処理ライブラリ

strace

システムコールのトレースツール

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-329

329
参
考

ソースコード詳細(external)
external
svox

text to speechサポートツール

tagsoup

XMLのSAXパーサ

tcpdump

パケットモニタリングツール

tinyxml

C++言語用XMLパーサ

tremolo
v8

マスタ タイトルの書式設定
オーディオデコーダ

javascriptレンダリングエンジ
ン

webkit

Webブラウザエンジン

wpa_supplicant

無線LANプロトコル用ライブラリ

wpa_supplicant_6

WPS2対応無線LANクライアントラ
イブラリ

xmlwriter

xmlの書き出し用ライブラリ

yaffs2

フラッシュメモリファイルシス
テム

zlib

圧縮アルゴリズムライブラリ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-330

330
参
考

JNIメソッドを一括登録する
Javaでネイティブ定義されたメソッドをJNIで認識させるためには
メソッドの命名規則を守って手動で記述したり、javahコマンドを
使って自動でヘッダファイルを作成する方法がありますが、メ
ソッド名が長く可読性が低くなります。
package com.sample.hellojni;
public class HelloJni {
static {
System.loadLibrary(“hellojni");
}

マスタ タイトルの書式設定

public native int openComm(String str, boolean debug);
public native void closeComm();
public native int getBaudrate();
public native boolean setParams(int i, int j, int k , int n);
public native int commWrite(byte b[], int off, int len);
public static native void setObject(new SomeObject());
public static native void stopTread();

定義されたネイティブメ
ソッドが多くなるにつれ
て、JNI側のコードが見難
くなるので、JNI側のコー
ドを見やすくするための
工夫が必要

メソッドを一括登録でき
るようにする

}
This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-331

331
参
考

JNIメソッドを一括登録する
AOSPから取得したソースコードにある「jniRegisterNativeMethods」を
自分の
NDKのプロジェクトで流用します。
dalvik/libnativehelper/include/nativehelper/JNIHelp.h
dalvik/libnativehelper/JNIHelp.c

マスタ タイトルの書式設定
以下の2つのファイルを用意す
る

<アプリのプロジェクト
>/jni/hellojni.h
<アプリのプロジェクト
>/jni/hellojni.c

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-332

332
参
考

JNIメソッドを一括登録する
hellojni.h
#include <jni.h>
#ifndef _hellojni_h
#define _hellojni_h
#ifdef __cplusplus
extern "C" {
#endif
jint openComm(JNIEnv *, jobject, jstring, jboolean);
void closeComm(JNIEnv *, jobject);
jint getBaudrate(JNIEnv *, jobject);
jboolean setCommParams(JNIEnv *, jobject, jint, jint, jint, jint);
jint commWrite(JNIEnv *, jobject, jbyteArray, jint, jint);
static void setListener(JNIEnv *, jclass, jobject);
static void stopThread(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-333

333
参
考

JNIメソッドを一括登録する
hellojni.c

#include <jni.h>
#include "jniserial.h“

ヘッダのinclude
呼び出しもとのJavaのパッケー
ジ名

マスタ タイトルの書式設定
static JNINativeMethod methods[] = {
static const char *classPathName = "com/sample/hellojni/HelloJni";

{ "openComm","(Ljava/lang/Object;)Ljava/lang/Integer;",(void*)openComm },
{ "closeComm", "(Ljava/lang/Object;)V",(void*)closeComm },
{ "getBaudrate", "(Ljava/lang/Object;)Ljava/lang/Integer;",(void*)getBaudrate },
{ "setCommParams", "(Ljava/lang/Object;)Ljava/lang/Boolean;",(void*)setCommParams },
{ "commWrite", "(Ljava/lang/Object;)Ljava/lang/Integer;",(void*)commWrite },
{ "stopThread", "(Ljava/lang/Object;)V",(void*)stopReadThread },
メソッド名と
{ "setListener", "(Ljava/lang/Object;)V",(void*)setListener }
メソッドのシグネ
};
チャ

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-334

334
参
考

JNIメソッドを一括登録する
hellojni.c
int registerNatives(JNIEnv* env) {
if (!registerNativeMethods(env, classPathName, methods, sizeof(methods)/ sizeof(methods[0])))
return JNI_FALSE;
登録するメソッドの数を算出し
return JNI_TRUE;
registerNativeMethods実行
}
||
int registerNativeMethods(JNIEnv* env, const char*JNIHelp.h にて定義されてます
className, JNINativeMethod* gMethods, int numMethods) {

マスタ タイトルの書式設定
jclass clazz;
clazz = (*env)->FindClass(env, className);
if (clazz == NULL) {
LOGD_IF(debug, "Native registration unable to find class '%s'", className);
return JNI_FALSE;
}
if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {
LOGD_IF(debug, "RegisterNatives failed for '%s'", className);
return JNI_FALSE;
}
return JNI_TRUE;

}

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-335

335
参
考

JNIメソッドを一括登録する
hellojni.c
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv *env;
if ((*vm)->GetEnv(gJavaVM, (void**) &env, JNI_VERSION_1_6) != JNI_OK) {
return -1; //error
}
if (registerNatives(env) != JNI_TRUE) {
return 0; //error
}
return JNI_VERSION_1_6;
}
static void setListener(JNIEnv *env, jclass clazz, jobject obj) {
通常のC/C++の
//このメソッドの具体的な処理
メソッド定義の
return;
ように
}
メソッド名を短
jint openComm(JNIEnv *env, jobject obj, jstring dev, jboolean debug_flag) {
縮できる
//このメソッドの具体的な処理
return 1;
}

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-336

336
参
考

Android用ドライバモジュール作成と組み込み方法

【環境】
開発用PCのLinuxシェル

①カーネルコンフィグの設定を変更
該当のモジュール設定値を「M」にする
*「7章デバイスを組み込んだカーネルの作成」を参照
②カーネルをmakeしてカーネルモジュール作成(hoge.ko)

マスタ タイトルの書式設定

[host_pc~] > cd $ANDROID/linux-2.6.26-at-android
[host_pc~] > make ARCH=arm CROSS_COMPILE=$ANDROID/prebuilt/linuxx86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- modules

*hoge.koができている場所(hoge.koがUSBシリアルデバイスだった場合)
Linuxカーネルのルート/drivers/usb/serial/hoge.ko

③Androidのルートファイルシステムの/data配下に②で作成したモジュールを配
置
④ Androidのルートファイルシステムの/etc配下にinstall_driver.shを作成して
実行権限を付与
($ chmod 777 /etc/install_driver.sh)
③init.rcを変更してsample.shを起動時にサービスして起動させる
5-337
This material is licensed under the Creative Commons
* 「5章ドライバのモジュールを組み込む」を参照
License BY-NC-SA 4.0.

337
参
考

Android用ドライバモジュール作成と組み込み方法

/init.rc
#追加
service install_driver /etc/install_driver.sh
oneshot

マスタ タイトルの書式設定

/etc/install_driver.s
h
#!/system/bin/bash
insmod /data/hoge.ko
sleep 20
chmod 666 /dev/hoge0
/system/bin/cmd_server
exit 1

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-338

338
メモ

マスタ タイトルの書式設定

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-339

339
マスタ タイトルの書式設定
本ドキュメントは下記が作成・提供しております。
株式会社OKIソフトウェア
http://www.oki-osk.jp
株式会社リーディング・エッジ社
http://www.leadinge.co.jp//

This material is licensed under the Creative Commons
License BY-NC-SA 4.0.

5-340

Android組込み開発基礎コース Armadillo-440編