しよう
Upcoming SlideShare
Loading in...5
×
 

しよう

on

  • 2,636 views

 

Statistics

Views

Total Views
2,636
Views on SlideShare
2,635
Embed Views
1

Actions

Likes
1
Downloads
5
Comments
0

1 Embed 1

http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

しよう しよう Presentation Transcript

  • AndroidでHello Worldしよう 日本Androidの会 永野行洋
  • 下準備  Eclipseのインストール  ADTプラグインのインストール  Android SDKのインストール
  • Eclipseのインストール  http://www.eclipse.org/downloads/ から Eclipse IDE for Java Developersを選択してダウンロー ド。  ダウンロードしたファイルを解凍する。  解凍したフォルダのeclipse.exeを実行する。
  • ADTプラグインのインストール  Window->Preferrenceからオプションメニュー を起動する。  Install/Updateより、Available Software Sitesを 選択する。  Addをクリック。  NameにADT。Locationにhttps://dl- ssl.google.com/android/eclipse/ を指定する。
  • ADTプラグインのインストール2  Help->Install New Softwareを選択する。  Work Withの欄にADTと入力する。  下欄に出てくるDeveloper Toolsを選択する。  Next->Next->I Accept...->Finishでインストー ル。
  • Android SDKのインストール  http://developer.android.com/intl/ja/sdk/1.5_r3/index.h からダウンロード。  ダウンロードしたファイルを解凍する。  EclipseのPreferencesにAndroidの項目が出てい るので、SDK Locationに解凍済みのSDKの フォルダを指定する。
  • プロジェクトの作成  [File] > [New] > [Project] を選択する。  [Android] > [Android Project] を選択し、[Next] >を選択する。
  • プロジェクトの作成2  Project NameにHelloAndroidと指定する。  Build TargetにGoogle APIsを指定する。  Application NameにHelloAndroidと指定する。  Package Nameにjp.android.helloandroidと指定す る。  Create ActivityにHelloAndroidと指定する。
  • プロジェクトの実行  Run->Debugで表示されるDebug AsにAndroid Applicationを選択する。  ビルドは自動で実行される。手動で行いたい ときはProject->Build Automaticallyのチェック を外す。  ビルドに使用するJavaのバージョンは1.5.xに しておくこと。
  • プロジェクトのカスタマイズ  res/layout/main.xmlを開く  ViewsからButtonをドラッグする。  TextをChangeに変更する。  TextViewをクリックし、idに@+id/Text01と入 力しておく。
  • プロジェクトのカスタマイズ2  HelloAndroid.javaを開く。  extends Activityの後ろにimplements OnClickListnerを追加する。  CTRL+1(Quick Fix)で表示される修正候補か らAdd Unimplemts Methodsを選択する。
  • プロジェクトのカスタマイズ3  OnCreate()に以下のコードを追加する。  Button b = (Button)findViewById(R.id.Button01);  b.setOnClickListener(this);
  • プロジェクトのカスタマイズ4  onClickに以下のコードを追加。  TextView v = (TextView)findViewById(R.id.Text01);  v.setText(“Text has changed.”);  再度プロジェクトを実行する。(今度はデ バッグのアイコンでOK)‫‏‬
  • 京都GTUG Android Hackathon 第一回Android勉強会 アクティビティ、View、ライフサイクル、インテント ⽇本Androidの会 組み込みWGリーダー 株式会社ブリリアントサービス 技術部研究開発課Android担当リーダ 近藤昭雄
  • 自⼰紹介 組み込み業界10年目のエンジニア ⽇本Androidの会の幹事 2007/11/12 Android SDKが発表された当⽇にAndroidまとめwiki開設 2008/02/05 Armadillo-500にAndroidをポーティング 2008/02/21 Android情報ブログ開設、ポーティング⽅法を公開 2008/04/25 Google Android SDK Hackathonに参加 2008/05/11 大阪でAndroid勉強会開催 2008/05/16 ESECのアットマークテクノブースでAndroidを紹介 2008/06/23 早稲⽥大学主催Android勉強会に登壇 2008/08/24 Android Embedded Japan(Google Group) 開設 2008/09/12 ⽇本Androidの会組み込みWGリーダー就任 2008/10/14 IT Expo Proに出展 2008/12/08 ⽇経Linux2009年1⽉号にAndroidの記事執筆 2009/02/20 OSC Tokyo 2009 SpringでAndroid Dev Phone 1のカスタマイズ⽅法の紹介 2009/02/27 Androidセミナー開催 2009/03/19、20 Android HackathonにTutorとして参加 2009/05/15、16 Androidアプリ開発セミナー開催 2009/05/18 Google Developer Dayのオフィシャルサポーターに 2009/06/09 Google Developer Dayのライトニングトークセッションに登壇 2009/06/10 Android HackathonにTutorとして参加
  • アクティビティ
  • アクティビティとは • 画⾯表⽰することができる基本的な機能の単位 • Activityクラスを継承することでUIまわりの⾯倒な処理を⾏わなくてもほとんど勝 ⼿にやってくれる • メソッドをオーバーライドすることで様々な処理が可能になる • 機能が違う画⾯を持つ別のアクティビティを起動して連携させる • 画⾯表⽰にはViewを使用する • アプリケーションはアクティビティの集合体 • 通常のActivity以外にもMapViewを扱うことに特化したMapActivityや、WebView などがある
  • アクティビティ • ActivityはAndroidManifest.xmlファイルに宣⾔しておかないと起動できない • AndroidManifest.xmlの中⾝
  • アクティビティ • アクティビティを増やすと、起動設定で起動時のアクティビティを選択できる
  • アクティビティ • main.javaをコピーして、ペースト • main2.javaができた
  • アクティビティ • main2の中⾝
  • アクティビティ • このままだとアクティビティとして利用できないので、AndroidManifest.xmlに main2を追加してやる
  • アクティビティ • 起動時のアクティビティで選択できるようになった。
  • ライフサイクル
  • ライフサイクル • アクティビティは基本的に以下の主なライフサイクルを持つ。 • onCreate(Bundle) アクティビティが最初に起動する時に呼ばれる。onSaveInstanceStateメソッドで保存された情報がある場合 は、引数のBundleにその情報が渡される。 • onStart() アクティビティが表⽰される直前に呼び出される。 • onResume() アクティビティがユーザーの⼊⼒を受け付けるようになる時に呼び出される。メディアの再⽣などを開始するの によいタイミング。 • onPause() アクティビティがバックグラウンドになる直前に呼び出される。このメソッドが呼ばれた後はメモリが少なくな るとプロセスが何の通知もなく破棄されることがあるので注意。
  • ライフサイクル • onStop() アクティビティがしばらく使われなくなった時に呼び出される(他のアクティビティが起動してバックグラウン ドになった時や、アプリケーションが終了する直前)。しかし、onPauseの説明で書いたようにメモリが少なく なった場合はonStopやonDestroyが呼び出されずにプロセスが破棄される場合があるので注意。 • onRestart() onStopが呼ばれた後に、他のアクティビティが終了する等で、再びアクティビティが表⽰される時に呼び出さ れる。 • onDestroy() アクティビティが破棄される直前に呼び出される。onStopの説明で書いたように呼び出されないこともあるの で注意。 • onSaveInstanceState(Bundle) インスタンスの状態を保存すべきタイミングで呼び出される。ここで引数のBundleに対して値を保存する。い ったんアプリケーションのプロセスが終了していても、保存した値はonCreateメソッドの引数に引き継がれる ので、再度起動した時にBundleで渡される値を利用して状態を復元させることができる。
  • 基礎編前編 ライフサイクルのシーケンス
  • ライフサイクル • 画⾯が回転すると onSaveInstanceState > onPause > onStop > onCreate > onStart > onResume となる。 • メソッドを簡単にオーバーライドするには、以下のように途中まで関数名を打ち込んだ状態で Ctrl+Spaceを押す。(Windowsの場合。LinuxやMacはキーバインドを変える必要がある) • onPauseをダブルクリックすると以下のようにメソッドが追加される。
  • レイアウト
  • レイアウトとは • そのものズバリ、画⾯構成を司る物。 • 画⾯表⽰のルート要素で、基本的にはxmlで記述する。(コードからの⽣成も可能) 主なレイアウトは以下の通り LinearLayout ウィジェットを⼀直線上に並べるレイアウト TableLayout HTMLのテーブルタグのように使用できるレイアウト RelativeLayout ウィジェット同⼠がお互いに相対的位置を指定できるレイアウト AbsoluteLayout 絶対座標で位置を指定できるレイアウト。現在は非推奨になってしまった。 細かいデザインができる為、使い勝⼿はよい。 FrameLayout 常に左上をベースにし、配置する場所は特定できないかわりに、 後から配置したウィジェットが前⾯になり、重ねあわせができるレイアウト
  • レイアウト LinearLayout 横に並べたところ→ xmlレイアウトのソースコード↓
  • レイアウト LinearLayout 縦に並べたところ→ xmlレイアウトのソースコード↓
  • View
  • Viewとは • GUIを構成する基本的な描画コンポーネント • LayoutもViewを継承して作られている 代表的なView TextView ⽂字を表⽰するView EditView ⽂字⼊⼒できるView ImageView 画像を表⽰するView Button ボタンを構成するView ScrollView コンテナをスクロールさせることのできるView MapView Map表⽰を構成するView WebView ブラウザ表⽰を構成するView
  • View • Buttonをレイアウトに追加してみる
  • View • Buttonを押したことを検知するにはButtonにIDを割り振る必要がある • [android:id]の属性に[@+id/button1]と指定することでIDをbutton1に指定でき る • ソースコードからこのIDのViewを取得するには以下のようにする
  • View • Buttonを押したことを検知するコード ※ボタンを押すと、ボタンの⽂字が”click!”に変わる。
  • インテントと インテントフィルタ
  • インテントとインテントフィルタ • Androidの最も重要な機能の⼀つ。 • Intentには「意図」「目的」という意味がある。 • 主にアクティビティを起動する際のパラメータに使用される。 • 大別すると明⽰的インテントと暗黙的インテントの2種類ある。 • 明⽰的インテントはアクティビティを直接指定して起動させる • 暗黙的インテントは明⽰的に起動させるアクティビティを指定せずに、インテント のパラメータに起動するアクティビティをある程度推測できるだけの情報(インテ ントフィルタ)を⼊れておく。すると該当するアクティビティが起動する。該当す るアクティビティが複数ある場合はユーザー選択のダイアログが表⽰される
  • インテントとインテントフィルタ • 明⽰的インテントの使い⽅ • クラスを直接指定して、startActivityで起動させる この場合、main2のアクティビティが起動する
  • インテントとインテントフィルタ • 暗黙的インテントの使い⽅ • クラスを直接指定せずに、アクション、データ型などを指定する。 • この場合は[image/jpeg]のデータをSENDすることができるメーラーが起動するこ とになる。 • 複数起動する場合は選択するダイアログが出る。
  • インテントとインテントフィルタ • インテントフィルタを記述することにより、インテントを受け取って起動できるよ うになる。 • AndroidManifest.xmlに以下の記述を追加すると・・・
  • アクティビティの 遷移、値の受け渡し
  • アクティビティの遷移 • アクティビティを遷移させる主な関数は以下の通り • startActivity アクティビティを起動させる • startActivityFroResult アクティビティを起動させて結果を受け取る
  • アクティビティ間の値の受け渡し • mainからmain2へ値を渡してみる • 値を渡すにはIntentのputExtra関数を使う。 • main.java • main2.java
  • アクティビティ間の値の受け渡し • main2の起動結果をmainへ渡してみる • 値を返すのもIntentのputExtra関数を使う。 • main.java
  • アクティビティ間の値の受け渡し • main2.java
  • アクティビティ間の値の受け渡し • "戻り値"がmainにわたったところ
  • お疲れ様でした!
  • 2009年8月14日 Android Hackathon in Kyoto 勉強会 MapViewの使い方 エモーションプラス 原 秀樹
  • MapViewとは何ぞや? このように 地図情報を表示するビュー と思ってください。  ビューとは?  ユーザーに情報を表示したり ユーザーからの指示を受け付 けたりするための部品  ボタンなどもビューの一種 Copyright© 2009 EMOTIONPLUS
  • 素朴な疑問…  マップデータをどうやって扱うんや?  何か処理を実装するのが面倒くさそうやな…  GPSからの位置情報取得もいるんやろ? Copyright© 2009 EMOTIONPLUS
  • 素朴な疑問…に対する回答  マップデータをどうやって扱うんや?  マップ用のView(MapView)を使えば気にしなくてよい!  ただしマップデータはインターネットから取得するのでネットに 接続されていないと表示が出ない!  何か処理を実装するのが面倒くさそうやな…  これもMapViewにほとんどお任せでOK!  ただしAPIを使うためのキー取得が必要です。  GPSからの位置情報もいるんやろ?  別に無くても使えます! Copyright© 2009 EMOTIONPLUS
  • 地図表示API  GoogleMapsのような地図表示をAndroid上で 実現するためのAPI  地図表示の他、アプリからのコントロールや地図上に マークを追加したりできる。  Android Maps APIを利用するためには… APIキーを取得する必要がある。  取得にはGoogleアカウントが必要 Copyright© 2009 EMOTIONPLUS
  • APIキーの取得方法(1)  証明書のフィンガープリントを取得  JDKに附属している「keytool」というツールを使う Keytool –list –keytool <ユーザ>¥.android¥debug.keystore ※このパスはEclipseからAndroidエミュレータを実行する場合 パスワードは何も入力せずに エンターを押す これが フィンガープリント Copyright© 2009 EMOTIONPLUS
  • APIキーの取得方法(2)  GoogleサイトからAPIキーを取得 http://code.google.com/intl/ja/android/maps-api-signup.html このチェックボックスにチェックを入れる ここにフィンガープリントを入力して[Generate API Key]を押す。 ※フィンガープリントは「**:**:**: …… :**:**」のようにコロンも入力 Copyright© 2009 EMOTIONPLUS
  • APIキーの取得方法(3)  ログイン画面が表示されたらログインするとAPIキーが表示 Copyright© 2009 EMOTIONPLUS
  • AVDの準備  エミュレータを使う場合、Google APIに対応したAVDが必要なので まだ作成していないのであれば作成しておく。  Eclipseのメニューから[Window]→[Android AVD Manager]を選択 Name 適当に Target [Google APIs – 1.5]を選択 SDCard 適当に(パスしてもOK) Copyright© 2009 EMOTIONPLUS
  • レイアウトの修正  レイアウトファイルにMapViewを追加します。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.google.android.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" こんな感じで android:enabled="true" android:clickable="true" android:apiKey=“<ここに取得したAPIキーを入れる>" /> </LinearLayout> Copyright© 2009 EMOTIONPLUS
  • アクティビティの修正  以下のように修正します。 import com.google.android.maps.MapActivity; import android.os.Bundle; Activityから public class MapTest extends MapActivity { MapActivityへ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected boolean isRouteDisplayed() { return false; 追加 } } Copyright© 2009 EMOTIONPLUS
  • マニフェストファイルの修正  Google提供ライブラリを追加  インターネットアクセスのパーミッションを追加 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android“… > <application android:icon="@drawable/icon" … > <activity android:name=".MapTest“ … > ※途中は省略 </activity> ライブラリを追加 <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:minSdkVersion="3" /> インターネットを使用 <uses-permission android:name="android.permission.INTERNET" /> </manifest> Copyright© 2009 EMOTIONPLUS
  • とりあえず動かしてみよう!  ここまでの情報でビルドして実行すると… お!マップが出た!(…アメリカやん) 指で動かしたりできますが…  ズームができない!  マップの中心位置を指定したい!  衛星写真が見たいぞ! などなど というわけで機能を追加しましょう! Copyright© 2009 EMOTIONPLUS
  • ズーム機能の追加  MapViewが提供するズームコントロールが簡単  他にMapControllerを使う方法もあります  アクティビティのonCreateメソッドを修正します。 import com.google.android.maps.MapActivity; import com.google.android.maps.MapView; import android.os.Bundle; public class MapTest extends MapActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { たったこれだけ! super.onCreate(savedInstanceState); setContentView(R.layout.main); MapView map_view = (MapView)findViewById(R.id.mapview); map_view.setBuiltInZoomControls(true); } } Copyright© 2009 EMOTIONPLUS
  • ズームコントロールがつくと…  マップ下部にズームボタン が自動的に配置される。  もちろんこのボタンを押して ズームイン/アウトができる。  ただしマップをタップしてのズー ムはできない。 ここに注目! Copyright© 2009 EMOTIONPLUS
  • 指定した位置を中央に  緯度、経度を使って地図の表示位置を指定  アクティビティのonCreateメソッドを修正します import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; public class MapTest extends MapActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MapView map_view = (MapView)findViewById(R.id.mapview); map_view.setBuiltInZoomControls(true); MapController map_ctrl = map_view.getController(); ①MapControllerを取得 // 北緯34度59分42秒 東経135度44分19秒 ②緯度、経度の値を計算 double latitude = 34.0d + 59.0d / 60 + 42.0d / 3600; double longitude = 135.0d + 44.0d / 60 + 19.0d / 3600; ③GeoPointクラスにセット int latitude_1e6 = (int)(latitude * 1E6); int longitude_1e6 = (int)(longitude * 1E6); ④地図の中心位置をセット GeoPoint point = new GeoPoint(latitude_1e6, longitude_1e6); map_ctrl.setCenter(point); map_ctrl.setZoom(16); // ズームレベル ついでにズームレベルもセット } } Copyright© 2009 EMOTIONPLUS
  • これで実行すると… どこかで見たような… そう、今私たちがいる この場所が… Copyright© 2009 EMOTIONPLUS
  • 地図情報を切り替えてみる  地図の他にこのような表示が行えます  衛星写真  ストリートビューに対応している場所の表示  渋滞情報の表示(ただし現在はアメリカの一部のみ)  実装は超簡単! map_view.setSatellite(true); // 衛星写真に切り替える こんな感じになります Copyright© 2009 EMOTIONPLUS
  • 最後に  今回パスしたもの  マーカー表示  GPSによる位置取得との連動  地図上から位置情報を取得  タッチパネル操作によるズーム処理 など 以上です。どうも有難うございました! ※内容の一部は、Google が作成、提供しているコンテンツをベースに変更したもので、 クリエイティブ コモンズの表示 2.5 ライセンスに記載の条件に従って使用しています。 Copyright© 2009 EMOTIONPLUS
  • NDKの使い方 Androidのネイティブ開発環境 2009.8.14 20:25 - 21:00 京都リサーチパーク 4号館2F ルーム2A 日本Androidの会 幹事 四国支部長 瀬戸 直喜 ※この資料の一部は、Google が作成、提供しているコンテンツをベースに変更したもので、クリエイティブ コモンズの表示 2.5 ライセンスに記載の条件に従って使用しています。
  • 自己紹介 徳島の某SIer系企業に勤務 業務系&Web系SE 実装系Webマガジン Codezine 「今からでも遅くない!これから始めるAndroid開 発」 連載中 第1回:Androidことはじめ http://www.codezine.jp/article/detail/4221/ 2
  • アジェンダ 3
  • NDK概要 4
  • NDKとは Native Development Kitの略 Androidアプリからコール可能なメソッド を実装するためのツール – C/C++ソースコードをコンパイル・ビルドし て、共有ライブラリを生成 – Androidアプリの一モジュールとして利用 – 実機へ展開する機能 5
  • NDKに含まれているもの 6
  • NDKの特徴 ARMv5TE(*)のバイナリ生成とデプロイ 簡単なビルドファイルを記述してコンパイル 安定版ネイティブAPIの一部が、将来のバー ジョンでも保証(但し、Android1.5以上) – C/C++ライブラリ(専用ライブラリ : Bionic libc) – Mathライブラリ – ログサポート 関連ツールを順次追加予定 *:組込機器に広く用いられる32bit RISC CPUアーキテクチャの高性能モデル 7
  • アーキテクチャ上のNDKとlibc Android NDK Bionic libc 8
  • Android専用ライブラリ「Bionic libc」 Bionic libcとは・・・ Android専用機能を有する C/C++ライブラリ 下記ライブラリとのバイナリ互換性なし – GNU Cライブラリ – ucLibc – その他LinuxのCライブラリ C++の例外機能は未サポート ARM及びx86をサポート 9
  • Bionic libcの由来 BSDのlibc + Linux + Android = Bionic libc – 故に、Bionic libcのライセンスは”BSDライセンス” BSDライセンス 10
  • Androidアプリとネイティブコード Android アプリケーション JNI(Java Native Interface) C/C++ネイティブコード Androidアプリからは通常のメソッドとして動作 11
  • ネイティブコードの実装と利用 アプリ側で‘native’キーワードをつけてメソッ ドを宣言 – native byte[] loadFile(string filePath); ネイティブ側でメソッドの実体を実装 共有ライブラリ(.so)として用意し、.apkファイ ルのAndroidアプリケーションに組み込む 12
  • ネイティブコードの実装と利用 共有ライブラリ名は標準UNIX規約に従う lib<モジュール名>.soとして、JNIのエントリポ イントを含める 例) FileLoader -> libFileLoader.so アプリ側から共有ライブラリをロード System.loadLibrary(“FileLoader”); …”lib”と”.so”は不要 13
  • NDK利用における注意事項 ネイティブコードありきの開発は良くない 原則Javaで、パフォーマンスを意識し、 ライフサイクルに則って記述すべき 下記の理由でネイティブコードで記述す ることは許されている – 既存のコードを流用するため – パフォーマンスを確保するため JNIを十分に理解することを推奨 14
  • NDKの使い方 15
  • NDKのインストール(Windowsの場合) インストールに必要なもの Android NDK release 1.5 Android SDK release 1.5 最新版のCygwin(Linux仮想実行環境) – Msysは未サポート – GNU Make 3.8.1以降 – gcc – ※gccとMakeはCygwinインストール時に指定 16
  • NDKのインストールの流れ 17
  • NDKのインストールの流れ 18
  • ① NDKの配置 インストール方法 NDKのアーカイブ後、Cygwin配下の任意の フォルダに、NDK本体を配置する 19
  • NDKのインストールの流れ 20
  • ②NDKルートパスの設定 インストール方法 Cygwinのホームディレクトリの.bashrc中に ANDROID_NDK_ROOTとして、NDKのルートパ スを設定 export ANDROID_NDK_ROOT=‘C:¥¥cygwin¥¥android-ndk-1.5_r1¥¥’ ※ export文を.bashrcの最終行に追加 ※ 「=」の両隣は空白文字を入れないこと ※ パスには空白文字を入れないことをオススメします 21
  • NDKのインストールの流れ 22
  • ③host-setup.shの実行 インストール方法 NDKのルートフォルダに移動 シェルスクリプト host-setup.sh を実行 23
  • NDKのインストールの流れ 24
  • ④インストール完了 “Host setup complete.”の表示を確認 25
  • ネイティブコードのビルド方法 26
  • ネイティブコードのビルド方法 27
  • ①ネイティブコードの配置 $NDK/sources/任意のフォルダ/に、下記フ ァイルを配置 – ネイティブのソースコード(.c) ・・・ ex. hello-jni.c – ヘッダファイル(.h) – makeファイル(Android.mk) 28
  • ネイティブコードの例 ■ first.c ・・・通常のCプログラム #include "first.h“ int first(int x, int y) { return x + y; } ■ second.c ・・・JNI形式で記述した “add関数” #include "first.h“ #include <jni.h> jint Java_com_example_twolibs_TwoLibs_add( JNIEnv* env, jobject this, jint x, jint y) { return first(x, y); } 29
  • ネイティブコードのビルド方法 30
  • Android.mkについて ネイティブプログラムをビルドするため のファイル スタティックライブラリ、または、共有ライ ブラリとしてモジュール化することを宣言 する 1つのモジュールに対して、複数の.mkフ ァイルで定義可能 31
  • ②Android.mkの記述 LOCAL_PATH := $(call my-dir) ・・・カレントディレクトリの指定 # first.c : スタティックライブラリとしてビルド include $(CLEAR_VARS) ・・・変数の初期化 LOCAL_MODULE := libtwolib-first ・・・モジュール名を記述 LOCAL_SRC_FILES := first.c ・・・ソースファイル名を記述 include $(BUILD_STATIC_LIBRARY) ・・・スタティックライブラリとしてビルド # second.c: first.cに依存する共有ライブラリのビルド include $(CLEAR_VARS) LOCAL_MODULE := libtwolib-second LOCAL_SRC_FILES := second.c LOCAL_STATIC_LIBRARIES := libtwolib-first・・・スタティックライブラリ名の利用 include $(BUILD_SHARED_LIBRARY) ・・・アプリから利用する共有ライブラリ 32
  • ネイティブコードのビルド方法 33
  • ③Application.mkの記述 Androidアプリケーションが必要とするネイティブ”モ ジュール”(ライブラリ)を定義する 配置場所$NDK/apps/<myapp>/Application.mk – <myapp>はアプリケーションの短縮名になる APP_PROJECT_PATH := $(call my-dir)/project APP_MODULES := twolib-first twolib-second APP_PROJECT_PATH:Androidアプリケーションソー スへのパス APP_MODULES:Android.mkのLOCAL_MODULEで定 義したモジュール名(空白区切り) 34
  • ネイティブコードのビルド方法 35
  • ④ビルド アプリケーションの短縮名を指定して、NDKの トップディレクトリからビルドを実行 make APP=<myapp> <myapp>は、Application.mkで定義したアプリケーションの 短縮名(ディレクトリ名) 36
  • アプリからネイティブコードを使う package com.example.twolibs; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class TwoLibs extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); int x = 1000; int y = 42; System.loadLibrary(“twolib-second”); ・・・ libtwolib-second.soをロードする int z = add(x, y); ・・・ JNI経由でネイティブメソッドを呼び出す tv.setText( "The sum of " + x + " and " + y + " is " + z ); setContentView(tv); } public native int add(int x, int y); ・・・ ネイティブメソッドの宣言 } 37
  • アプリ実行結果 38
  • NDKの使い方まとめ 39
  • 終わり 40
  • おまけ:再コンパイル方法 再コンパイル方法 ① Makeでネイティブコードを再コンパイル ② Eclipse等でJavaアプリを再コンパイル ※ ① → ②の順序でコンパイルすること 41