マルチ OS エンジンを使用した固定記憶域の操作 (テクノロジー・プレビュー) - パート 2

Similar documents
マルチ OS エンジンを使用した固定記憶域の操作 (テクノロジー・プレビュー) - パート 1

Microsoft Word - Android_SQLite講座_画面800×1280

Microsoft Word - Android_SQLite講座_画面800×1280

Microsoft PowerPoint ppt

プログラミング基礎I(再)

新・明解Java入門

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

TestDesign for Web

データアダプタ概要

Prog2_12th

Java演習(4) -- 変数と型 --

Prog2_10th

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

SpringSecurity

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Prog2_10th

テーブルの確認 sqlite>.tables.tables コマンドでデータベース内のテーブル一覧を表示する テーブルスキーマの表示 sqlite>.schema mytable.schema コマンドで指定のテーブルのスキーマを表示できる テーブル出力の整形.explain コマンドを使うと テー

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

Java講座

Android Layout SDK プログラミング マニュアル

Hello, Android

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Javaプログラムの実行手順

S2DaoでもN:Nできます

V8.1新規機能紹介記事

Microsoft Word - Android_DI講座_画面800×1280

JAVA とテンプレート

GUIプログラムⅣ

android2.indd

Microsoft Word - tutorial3-dbreverse.docx

GUIプログラムⅡ

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

そして 取得した OutputStream インスタンスを使い 文字コードは UTF-8 として PrintWriter インスタンスを生成して あとは PrintWriter.append() で書き込みたい文字 列を渡して close() で保存する というだけです ファイルの読込み方法 それで

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

クラウド内の Java - 動画スクリプト 皆さん こんにちは Steve Perry です 私たちが作成した人事アプリケーションを覚えていますか? 今回は そのアプリケーションをクラウド内で実行しましょう コードは GitHub の

tkk0408nari

Prog2_9th

アルゴリズムとデータ構造1

Vuzix M100 SDKインストールガイド

PowerPoint Presentation

解きながら学ぶJava入門編

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft Word - Android_DI講座_画面800×1280

ALG ppt

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Java - Visual Editor

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

JavaプログラミングⅠ

ファイルを直接編集する画面を切り替えることができる. 図 3 標準のレイアウトを削除する (2) グラフィカル レイアウト画面で LinearLayout(Vertical) を追加するパレットウィンドウの レイアウト の中にある LinearLayout(Vertical) をドラッグして, 編集

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

JavaプログラミングⅠ

WebReportCafe

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

プログラミング入門1

JAVA入門

Java知識テスト問題

Prog2_6th

第1章 ビジュアルプログラミング入門

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

MISAO with WPF

InstallShield FAQ < 独自の InstallShield 前提条件を作成する > 注 ) このドキュメントは InstallShield 2014 Premier Edition を基に作成しています InstallShield 2014 以外のバージョンでは設定名などが異なる場合

デジタル表現論・第4回

PowerPoint Presentation

S2Pradoの紹介

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

スライド 1

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

プログラミング入門1

Prog2_10th

日 力力 生 行行 入 入 力力 生 用 方

: : : TSTank 2

1: Preference Display 1 package sample. pref ; 2 3 import android. app. Activity ; 4 import android. content. Intent ; 5 import android. content. Shar

storage-sdk-Java

Prog1_10th

基本情報STEP UP演習Java対策

WebReportCafe

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

Prog2_2nd

C/C++からJVMを起動します

文字列操作と正規表現

A. InstallScript プロジェクト InstallScript インストールは InstallScript エンジンによって制御され 決められた順序で一連のイベントが生成されます これらのイベントは インストールを実行するソフトウェアハンドラーをトリガーします たとえば インストールがロ

日本アンドロイドの会 四国支部 Kickoff ミーティング in ABC2009

PowerPoint Presentation

A B 1: Ex. MPICH-G2 C.f. NXProxy [Tanaka] 2:

Android プログラム ガイド

Prog1_15th

Java言語 第1回

WTM2019SingleSignOn

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

第 1 章 Java 言語について ( オブジェクト指向, 変数の扱い方, 繰り返し条件と条件分岐 ) Java 言語の概要とオブジェクト指向, 変数の扱い方, 繰り返し条件と条件分岐について理解し, プログラム作成を行う 1.1 Java 言語の概要 JAVA は Sun Microsystems

intra-mart Accel Platform

DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

「Android Studioではじめる 簡単Androidアプリ開発」正誤表

情報技術 Java の特徴 Java は現在 事務処理計算用プログラミング言語として開発された COBOL に取って代わり C 言語や C++ と並んで 現在最も使われているプログラミング言語の一つである Java は Write Once, Run Anywhere( プログラムを一度作成したらど

Transcription:

マルチ OS エンジンを使用した固定記憶域の操作 ( テクノロジー プレビュー ) - パート 2 この記事は インテル デベロッパー ゾーンに公開されている Working with persistent storage using Multi-OS Engine (Technology Preview) - Part 2 の日本語参考訳です この記事は 固定記憶域の操作に関するチュートリアルのパート 2 です ここでは sqlite.h ファイルのバインディングを生成することで ios* および Android* で MOE を用いて SQLite ライブラリーを利用し sqlite.h ファイルにアクセスする方法を示します このチュートリアルのパート 1 はこちらからご覧になれます ここでは パート 1 で使用したアプリケーションを基に作業します sqlite Web サイトから sqlite3.h をダウンロードして 共通ライブラリーのディレクトリーに配置します C ヘッダーファイルから Java* のバインディングを生成するには [MOE Actions] > [Generate Bindings] メニューを選択します

MOE により sqlite に関連するすべての NatJ バインディングを含む新しいディレクトリーが作成されます このバインディングを使用してデータベース インスタンスを作成し 両プラットフォームに共通の CRUD 操作を実行します

生成されたクラスファイルにアノテーション @Library("sqlite3") を追加します @Library アノテーションは マークしたクラスが動作するためにロードする必要があるネイティブ ライブラリーの名前を指定します NatJ.register() が呼び出されると NatJ は呼び出し元のクラスでこのアノテーションを検索し NatJ.lookUpLibrary(...) で指定されたライブラリーのロードを試みます @Library("sqlite3") @Runtime(CRuntime.class) public final class Globals { static { NatJ.register(); ネイティブ C ポインターにアクセスするため MOE の NatJ バインディングも必要です 依存項目として natj-api.jar ライブラリーを共通ライブラリー フォルダーに追加します この jar は github プロジェクトにあり アプリケーションのプロジェクトに直接インポートすることができます 次に データベースのデータモデルとなる Note クラスを作成します public class Note implements Comparable<Note>{ private Integer id; private String note; public void setid(int i){ id =i; public Integer getid(){ return id; public void setnote(string s){ note = s; public String getnote(){ return note; public int compareto(note o) { return this.id.compareto(o.id); データベースの作成 管理とノートの保存を行うための共通コードを作成します データベース インスタンスのオープンとクローズには SQLiteDatabaseHelper.java を使用します コンストラクターに プラットフォーム固有のデータベース ファイルのディレクトリー パスが渡されます oncreate メソッドは ノートテーブルが存在しない場合 テーブルを新規作成します

SQLiteDatabase.java クラスは 挿入 削除 更新 および選択クエリーを処理します このクラスのメソッドは ネイティブ sqlite 操作を抽象化します 例えば 以下は挿入クエリーの実装です public void insert(string note) { StringBuilder sql = new StringBuilder(); sql.append("insert"); sql.append(" INTO "); sql.append(table); sql.append(" (note) values ("); sql.append("\""); sql.append(note); sql.append("\")"); execsql(sql.tostring()); execsql メソッドは SQL クエリーを実行する SQL ステートメントを準備します public void execsql(string statement) { SQLiteStatement stmt = new SQLiteStatement(statement, null); if (stmt.prepare(dbhandle)) { if (!stmt.exec()) { System.err.println("Error executing - " + stmt.getlasterror()); else { System.err.println("Error executing - " + stmt.getlasterror()); System.err.println("\tin: " + stmt.getstatement()); SQLiteStatement.java は prepare() exec() query() strep() close() のような sqlite ライブラリーのネイティブルーチンを処理します このクラスは バインディングによって生成されたネイティブ C API 呼び出しを使用します 以下は prepare() メソッドと exec() メソッドの実装例です public boolean prepare(voidptr dbhandle) { if (dbhandle == null) { throw new NullPointerException(); this.dbhandle = dbhandle; @SuppressWarnings("unchecked") Ptr<VoidPtr> stmtref = (Ptr<VoidPtr>) PtrFactory.newPointerPtr( Void.class, 2, 1, true, false); int err = Globals.sqlite3_prepare_v2(dbHandle, statement, -1, stmtref, null); if (err!= 0) { lasterror = Globals.sqlite3_errmsg(dbHandle); return false; stmthandle = stmtref.get(); int idx = 0; for (Object bind : bindargs) { idx++; if (bind instanceof String) { err = Globals.sqlite3_bind_text(stmtHandle, idx, (String)bind, -1, new Globals.Function_sqlite3_bind_text(){

public void call_sqlite3_bind_text(voidptr arg0){ ); else if (bind instanceof Integer) { err = Globals.sqlite3_bind_int(stmtHandle, idx, (Integer) bind); else if (bind instanceof Long) { err = Globals.sqlite3_bind_int64(stmtHandle, idx, (Long) bind); else if (bind instanceof Double) { err = Globals.sqlite3_bind_double(stmtHandle, idx, (Double) bind); else if (bind == null) { err = Globals.sqlite3_bind_null(stmtHandle, idx); else { lasterror = "No implemented SQLite3 bind function found for " + bind.getclass().getname(); return false; if (err!= 0) { lasterror = Globals.sqlite3_errmsg(dbHandle); return false; return true; public boolean exec() { if (stmthandle == null) { throw new RuntimeException("statement handle is closed"); //LOG.debug("Execing " + statement); int err = Globals.sqlite3_step(stmtHandle); if (err == 101 /* SQLITE_DONE */) { affectedcount = Globals.sqlite3_changes(dbHandle); lastinsertedid = Globals.sqlite3_last_insert_rowid(dbHandle); close(); if (err!= 101 /* SQLITE_DONE */) { lasterror = Globals.sqlite3_errmsg(dbHandle); return false; return true; 上記のコード例を基に sqlite ステートメント クラスのさまざまなメソッドを実装できます SQLiteCursor.java クラスは ステートメント クラスのデータ抽出 API を処理します 以下のメソッドは 実行したクエリーから整数値と文字列を取得します public String getstring(int i) { if (stmt == null) { throw new RuntimeException("statement is closed"); return Globals.sqlite3_column_text(stmt.getStmtHandle(), i); public int getint(int i) { if (stmt == null) { throw new RuntimeException("statement is closed"); return Globals.sqlite3_column_int(stmt.getStmtHandle(), i);

Android* には専用の SQLite バージョンがあり その実装はネイティブバージョンとわずかに異なるため 両プラットフォーム間でのコードの再利用が制限されます そのため ここでは NatJ バインディングを使用して Android* 用にカスタムバージョンの sqlite を作成します Android* が SQLite のネイティブ C 呼び出しを処理できるように ネイティブ SQLite のダイナミック共有オブジェクト ライブラリーを作成して ランタイムにリンクします sqlite.so のほかにも libnatj.so と libc++_shared.so の 2 つのライブラリーをプロジェクトにリンクします libnatj.so は MOE の NatJ 呼び出しを使用するための NatJ ブリッジです libc++_shared.so は Android* 4.x をサポートするためのものです Android* 5.x では不要です.so ネイティブ ライブラリーを使用できるように build.gradle ファイルを変更する必要があります 最初に sourcesets で jnilibs に src ディレクトリーを指定します sourcesets { main { manifest.srcfile 'src/main/androidmanifest.xml' java.srcdir 'src' res.srcdir 'res' assets.srcdir 'assets' jnilibs.srcdir 'src/main/native-libs' jni.srcdirs = [] // ndk-build の自動呼び出しを無効にする 次に ネイティブ ライブラリーの jar ファイルを作成します

task nativelibstojar(type: Zip, description: 'create a jar archive of the native libs') { destinationdir file("$builddir/native-libs") basename 'native-libs' extension 'jar' from filetree(dir: 'src/main/native-libs', include: '**/*.so') into 'lib/' そして jar ファイルをビルドします tasks.withtype(org.gradle.api.tasks.compile.javacompile) { compiletask -> compiletask.dependson nativelibstojar clean.dependson 'cleancopynativelibs' tasks.withtype(com.android.build.gradle.tasks.packageapplication) { pkgtask -> pkgtask.jnifolders = new HashSet() pkgtask.jnifolders.add(new File(buildDir, 'native-libs')) ios* はネイティブバージョンの sqlite でビルドされているため ライブラリーをリンクせずに直接使用できます 次に ios* と Android* 向けに データベース呼び出しのためのプラットフォーム固有のコードを作成します ios* 固有コード SQLiteDatabaseHelper 共通クラスを拡張する SQLiteDatabaseHelper クラスを作成します ios* 固有のドキュメント ディレクトリーのパスを取得するため getdocumentspath() メソッドのみオーバーライドします protected String getdocumentspath() { NSArray paths = Foundation.NSSearchPathForDirectoriesInDomains( NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true); return (String) paths.firstobject(); MasterViewController の viewdidload() メソッドで コンストラクターにデータベースの filepath を渡して データベースヘルパー インスタンスを作成します データベース インスタンスを作成し getwritabledatabase() メソッドでその参照を取得します @Selector("viewDidLoad") public void viewdidload() { // ビューをロード ( 通常は nib から ) した後 追加のセットアップを行う navigationitem().setleftbarbuttonitem(editbuttonitem()); ISQLiteDatabaseHelper helper = new SQLiteDatabaseHelper(dbFileName); db = helper.getwritabledatabase();

追加ボタンにリスナーメソッドを追加し データベースへの挿入クエリーを実行します @Selector("insertNewObject:") public void insertnewobject(object sender){ db.insert(defaulttext); makeobjects(); NSIndexPath indexpath = NSIndexPath.indexPathForRowInSection(0,0); tableview().insertrowsatindexpathswithrowanimation((nsarray) NSArray.arrayWithObject(indexPath), UITableViewRowAnimation.Automatic); performseguewithidentifiersender("showdetail", this); DetailViewController で 更新 API を呼び出してデフォルトのテキストへの変更を更新します テキストが空白の場合はノートを削除します @Selector("doSaveNote:") public void dosavenote( Object sender){ if (detailnote == null db == null) { return; if(!datatext.text().equals("")){ detailnote.setnote(datatext.text()); db.update(detailnote); else{ db.delete(detailnote.getid()); Android* 固有コード ios* と同様に AndroidDatabaseHelper クラスを作成し Android* の sqlite ファイルのディレクトリー パスを渡すように getdocumentspath() をオーバーライドします protected String getdocumentspath() { return Environment.getExternalStorageDirectory().getPath(); ios* と同様に データベースヘルパー インスタンスとデータベース インスタンスを作成します つまり ios* の viewdidload() に相当する MainActivity.java の oncreate() を作成します protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); SQLiteDatabaseHelper dbhelper = new AndroidSQLiteDatabaseHelper( AndroidSQLiteDatabaseHelper.DB_NAME); db = dbhelper.getwritabledatabase();... 追加ボタンにリスナーメソッドを追加し データベースへの挿入を実行します

public void insertnewobject() { db.insert(default_text); makeobjects(); ユーザー入力に応じて EditorActivity.java は更新 / 削除クエリーを呼び出します private void finishediting() { String newtext = editor.gettext().tostring().trim(); if (newtext.equals("")){ newtext = DEFAULT_TEXT; db.delete(noteid); else if (!newtext.equals(note)){ notedetail.setnote(newtext); db.update(notedetail); finish(); アプリケーションを実行すると プラットフォームでデータベース ファイルが作成されます このように 両プラットフォームで同じ sqlite 実装を利用して コードのロジックを再利用できます これにより コーディングの労力を大幅に軽減でき コードの保守が容易になります コンパイラーの最適化に関する詳細は 最適化に関する注意事項を参照してください