ExternalObjectパッケージ(Android)

 

 

外部ライブラリとの連携のためのパッケージです。

Android標準ライブラリと連携し、Java外部オブジェクトの生成、および実行のためのクラスと、他のAndroidアプリに対しインテントを発行するためのクラスが用意されています。

クラス

 

PKG

名前

説明

1

ExternalObject

(Java連携用)

Javaオブジェクトを保持します

1

ExtVal

(Java連携用)

Javaデータ型を一致させるためのクラスです

1

Intent

他のアプリに対しインテントを発行するためのクラスです

HT(10)

ExternalService

Biz/Browser SmartDeviceおよびBiz/Browser HT向けに作られたAndroidサービスと連携するためのクラスです。

 

セキュリティレベル

 

ExternalObjectパッケージの利用はセキュリティレベルによって制限されています。ExternalObjectパッケージはセキュリティレベルを0に設定することで利用できます。

セキュリティレベル1以上では、ExternalObjectパッケージのクラスをインスタンス化しようとしたときに例外が発生します。

 

CRSとJava間のデータ型変換

 

CRSからJavaオブジェクトへ値を渡す場合、また逆にJavaオブジェクトから結果を受け取る場合、それぞれの言語のデータ型に自動的に変換が行われます。

変換ルールは以下のようになります。

 

CRSからJavaへの値変換ルール

引数の受け渡し時やフィールドへの設定時などに適用されるルールです

 

◇ExtValを渡した場合

変換元(CRS)

変換先(Java)

ExtVal.Boolean

boolean型 (プリミティブ型)

ExtVal.Char

char型 (プリミティブ型, 2byte符号付き整数, 文字表現用)

ExtVal.Byte

byte型 (プリミティブ型, 1byte符号付き整数)

ExtVal.Short

short型 (プリミティブ型, 2byte符号付き整数)

ExtVal.Int

int型 (プリミティブ型, 4byte符号付き整数)

ExtVal.Long

long型 (プリミティブ型, 8byte符号付き整数)

ExtVal.Float

float型 (プリミティブ型, 4byte単精度浮動小数点数)

ExtVal.Double

double型 (プリミティブ型, 8byte倍精度浮動小数点数)

 

◇CRSオブジェクトを渡した場合

変換元(CRS)

変換先(Java)

Number

整数値ならばint型

小数点以下の値を保つ場合double型として解釈

Date

java.util.Dateクラス

String

java.lang.Stringクラス

ByteArray

byte[]型

ExternalObject

格納されているインスタンスのクラス

その他(nullを含む)

例外発生(型解決不能)

 

JavaからCRSへの値変換ルール

メソッドの戻り値やフィールドからの取得時などに適用されるルールです。

 

◇プリミティブ型を受け取った場合

変換元(Java)

変換先(CRS)

boolean型

trueならば1, falseならば0

char型

整数値

byte型

整数値

short型

整数値

int型

整数値

long型

整数値

(4byte符号付き整数が表現できる範囲に切り詰められます)

float型

Numberオブジェクト

double型

Numberオブジェクト

 

◇参照型を受け取った場合

変換元(Java)    

変換先(CRS)

null値(型によらず)

null値

java.lang.String

Stringオブジェクト

byte[]

ByteArrayオブジェクト

その他オブジェクト

ExternalObjectオブジェクト

 

プリミティブ型とボックス化

 

Java言語における型は大きく分けて「プリミティブ型」と「参照型」に別れます。

ExternalObjectパッケージのJava連携機能ではExtValクラスがプリミティブ型を、ExternalObjectクラスが参照型をそれぞれラップします。

 

Java言語では、プリミティブ型をObject型を継承する参照型に変換することを「ボックス化(boxing)」と呼びます。

例として、int型の値をjava.lang.Integerクラスのインスタンスに変換する処理が相当します。

また、参照型をプリミティブ型に変換することを「ボックス化解除(unboxing)」と呼びます。

例として、java.lang.Doubleクラスのインスタンスをdouble型の値に変換する処理が相当します。

 

ボックス化及びボックス化解除は、通常Javaコンパイラによって自動的に行われるものですが、ExternalObjectのJava連携を使用する場合は明示的に行う必要があります。

CRSにおいては、ボックス化にはExtVal.Boxingメソッドを、ボックス化解除にはExternalObject.Unboxingメソッドを使用します。

 

Javaプリミティブ型と、それに対応するJava参照型の対応は下記のとおりです。

 

ボックス化,ボックス化解除におけるプリミティブ型と参照型の対応

ExtVal.Typeの値

ExtVal.Typeが示す

プリミティブ型

対応するJava参照型

ExtVal.Boolean

boolean型

java.lang.Booleanクラス

ExtVal.Char

char型

java.lang.Characterクラス

ExtVal.Byte

byte型

java.lang.Byteクラス

ExtVal.Short

short型

java.lang.Shortクラス

ExtVal.Int

int型

java.lang.Integerクラス

ExtVal.Long

long型

java.lang.Longクラス

ExtVal.Float

float型

java.lang.Floatクラス

ExtVal.Double

double型

java.lang.Doubleクラス

 

外部Jarファイルのロード

 

ExternalObjectパッケージではExternalObject.LoadJarメソッドを用いて外部Jarファイルをロードすることができます。

この時に指定するライブラリIDはロードされたJarファイル内のクラス情報を保持するクラスローダを管理するための値です。他のライブラリと被らない空ではない非nullの文字列を指定します。

ライブラリIDが使用されているかを調べるにはExternalObject.IsLibraryIdUsedメソッドを使用してください。

 

AndroidのDalvik仮想マシンはPC用(一般的なJava)のjarファイルをそのまま実行できないため、作成したjarファイルをAndroid SDK付属のツール(dxコマンド)を使用しAndroidが解釈できる形式に変換する必要があります。

 

ExternalObjectコンストラクタやExternalObject.InvokeStaticメソッドなどでクラスを指定する際にロード時と同じライブラリIDを指定することで、そのクラスローダからクラス情報を読み出します。

なお、クラス名(完全限定名)が同じクラス,インタフェースでもライブラリIDが異なる場合、異なる型として扱われます。

 

Androidが元々ロードしているクラス(java.lang.Stringやandroid.graphics.Point)等はシステムクラスローダが

管理しています。これらのクラスを利用する場合、ライブラリIDにnullを指定してください。

 

Androidアプリとしてのパーミッションによる制約について

 

Biz/Browser HTは他の一般的なAndroidアプリ同様、機能を実現するためにAndroid OSに対しパーミッションと呼ばれるものを要求します。

パーミッションはAndroidアプリがどのような機能に対してアクセスする可能性があるかを明示するもので、Androidアプリのインストール時にその一覧が表示されます。

Androidアプリは要求したパーミッション以外の機能にアクセスすることはAndroid OSによって禁止されます。

 

そのため、ExternalObjectクラスを用いてAndroid標準ライブラリやJarファイルの形で提供されるライブラリ等を使用する場合、Biz/Browser AIに付与されているパーミッションで可能な範囲の処理となっている必要があります。

ライブラリを使用する前に予め必要となるパーミッションをご確認下さい。

 

Biz/Browser HTがAndroidOSに対して要求するパーミッションはAndroid版の特徴と制約に記載されています。

 

引数の指定方法

 

Javaクラスのコンストラクタやメソッドの引数に指定できるものには、CRSの一般的な方やリテラル、ExternalObjectオブジェクト、ExtValオブジェクトがあります。

引数はCRSJava間の型変換のルールに従いJavaプリミティブ型またはJava参照型に渡されます。

 

例)

数値リテラルをそのまま指定する

var extobj = new ExternalObject("java.util.Random", null, 999);
var ret = extobj.Invoke("nextInt", 100);
print(ret, "\n");

 

文字列型の変数を指定する

var str = "TMP";
var ret = ExternalObject.InvokeStatic("java.lang.System", null, "getenv", str);
print(ret, "\n");

 

ExtValクラスを使ってJavaプリミティブ型を指定する

var v = new ExtVal(true, ExtVal.Boolean);
var ret = ExternalObject.InvokeStatic("java.lang.Boolean", null, "toString", v);
print(ret, "\n");

 

ExternalObjectクラスを使ってJava参照型を指定する

var v1 = new ExternalObject("android.graphics.Point", null, 10, 20);
var v2 = new ExternalObject("android.graphics.Point", null, 30, 40);
var ret = v1.Invoke("equals", v2);
print(ret, "\n");

 

ExternalObject.Castメソッドを使って型変換したJava参照型を指定する

var extobj1 = new ExternalObject("java.io.FileOutputStream", null, "/sdcard/test.txt");
var extobj2 = new ExternalObject("java.io.BufferedOutputStream", null, extobj1.Cast("java.io.OutputStream"));
/* … */
extobj2.Invoke("close"); 
extobj1.Invoke("close");

 

値に変換できないその他のCRSオブジェクトや参照を指定した場合はエラーになります。

 

コンストラクタ、メソッドの呼び出しでは、呼び出し先で定義されているすべての引数の型と完全に一致している必要があります。(参照型、値型の違いも含む)

 

参照型の場合、要求されているクラスの派生クラスを渡す場合は明示的にExternalObject.Castメソッドを呼び出し基底クラスへの参照に変換する必要があります。

また、null値を指定する場合、ExternalObject.NullRefメソッドを用いて型情報を持つnull参照を作成する必要があります。

 

プリミティブ型の場合、暗黙的な値のワイドニング変換、ナローイング変換は行われません。ExtValオブジェクトを用いて明示的に要求されている型を指定してください。

 

ボックス化(boxing)や参照型のボックス化解除(unboxing)は明示的に行う必要があります。ボックス化及びボックス化解除につきましてはプリミティブ化とボックス化を参照してください。

 

クラス名、メソッド名、すべての引数の型が一致しない場合は、呼び出し先を見つけることができずにエラーとなります。

 

ユーザー例外の発生

 

ExternalObject.Invokeメソッド、またはExternalObject.InvokeStaticメソッドでは、Javaクラス側で発生した例外を捕捉することができます。

対象となるメソッド内で例外をスローすると、Biz/BrowserではInvokeおよびInvokeStaticに失敗したことを示すEXTOBJ-4例外が発生します。

CRSの例外オブジェクトには子オブジェクトExtExceptionが付加されます。ExtExceptionはJava側でスローした例外を保持するExternalObjectオブジェクトです。

この機構によりCRSからJavaの例外クラスにアクセスして情報を取得することができます。

 

例)例外を捕捉

try {
    var extobj = ExternalObject.InvokeStatic("sampleNS.SampleClass", "sampleLib");
    extobj.Invoke("SampleMethod");
} catch (e) {
    if (e.Method == "EXTOBJ" && e.Code == 4) {
        MessageBox(e.ExtException.Invoke("toString"));
    }
}

 

なお、EXTOBJ-4例外以外でもEXTOBJ例外オブジェクトの子オブジェクトとしてExtExceptionが付加される場合があります。

ExtExceptionが付加されているかを調べるにはObject.FindChildを使用します。

 

ExternalObject(Java連携)のアーキテクチャ

 

Biz/Browser HTは一般的なAndroidアプリケーションと同じくDalvik仮想マシンまたはART上(一部ネイティブコード)で動作しています。

そのため、ExternalObjectのJava連携機能ではJavaの機能の一部であるリフレクションを用いることでJavaのオブジェクトを操作しています。

 

JavaオブジェクトはBiz/Browserと同じメモリ空間に作成されます。

そのため、Javaオブジェクト内で大量のメモリ確保を行った場合Biz/Browser自体がメモリ不足で停止する可能性がありますためご注意ください。

 

また、Biz/Browserの動作保護のため、jp.co.opst.bizsd名前空間のオブジェクトに対する操作を禁止しています。

この名前空間のオブジェクトに対し操作を行った場合、EXTOBJ-11例外が発生します。

実行ログ出力

 

Java連携機能はデバッグ機能としてログ出力機能を持っています。

 “/sdcard/Android/data/jp.co.opst.bizht.v1/files”フォルダに".logging.on"(ファイル名先頭のドットにご注意ください)という名前のファイルを配置するとBiz/Browserは同じディレクトリに”ExternalObject.log”という実行ログファイルを出力します。”.logging.on”ファイルはファイルさえあれば0バイトでも構いません。

 

 



「オンラインマニュアル」一覧へ戻る
「Bizの宝箱」TOPへ戻る