JExternal

dv4.1J

JExternalとは

JExternalとは、4DからJavaメソッドを実行するためのプラグインです。Javaで書かれたいろいろな分野の豊富なライブラリーを4Dから利用することができます。

JarファイルをJavaClassesフォルダに入れておくと、その中にあるJavaメソッドを4Dから呼び出し、実行することができます。実行中のJavaメソッドが、4Dメソッドを呼び出すコールバック機能もあります。JExternalバージョン4.1.1以降では、Javaメソッドは、4Dプロセスに対応したそれぞれのネイティブスレッドの中で動作します。複数のJavaメソッドの並列処理が可能です。


動作環境

JExternalは、Mac OS、Windows両プラットフォーム上のv6.06以降の4th Dimention、4D Serverで動作します。

ただし、v2004以前の4Dで使用する場合、インテルプロセッサーが搭載されたMacでは動作しません。これは、JExternalがRosetta上では動作できないからです。インテルプロセッサーが搭載されたMacでは、バージョン4.1.1以降のJExternalを4D v11以降で使用する必要があります。

Windowsでは、Sun Microsystems社のJavaバーチャルマシンが必要です。


特徴

1

JavaClassesフォルダの拡張子.jarファイルは、自動的にJavaクラスパスに登録され、その中の Javaメソッドは、4Dから実行可能な状態になります。JavaClassesフォルダは、次のフォルダに配置することができます。

     
  1. パッケージ(JExternal_4xx.bundle)のContentsフォルダ
  2. ストラクチャファイルがあるフォルダ
  3. アプリケーションファイル(4th Dimension, 4D Server, 4D Client)があるフォルダ
  4. 4Dフォルダ(ACIフォルダ)

上記の順番で、JavaClassesフォルダは探索され、最初に見つかったJavaClassesフォルダのみが採用されます。

2

JExternalは、クラスメソッドとインスタンスメソッドの両方を実行することができます。

3

JExternalによって4Dから実行されたJavaメソッドの中から、4Dメソッドを実行するコールバック機能があります。

4

4Dの機能を拡張するという観点から、JExternalによって実行されるJavaメソッドを、従来のプラグインのように考えることができます。一度Javaメソッドを作成すれば、原則としてそれはそのままMacでもWindowでも全く同様に動作します。従来のプラグインのように、プラットホームごとにプラグインを用意する必要はありません。

5

JExternalは、Javaバーチャルマシンを起動するプラグインJWroldと一緒に使用する必要があります。

6

プラグインJExternalおよびJWroldは、Plugins(またはMac4DX/Win4DX)フォルダ内にあるプラグインファイル以外に、Java関連のファイル(JExternal_xxx.jar、JWorld_xxx.jar、java.securiy、 libJWorld.jnilib)を必要とします。これらのファイルは、RonriKoboフォルダ内になければなりません。RonriKoboフォル ダは、次のフォルダに配置することができます。

     
  1. パッケージ(JWorld_4xx.bundle)のContentsフォルダ 
  2. ストラクチャファイルがあるフォルダ
  3. アプリケーションファイル(4th Dimension, 4D Server, 4D Client)があるフォルダ
  4. 4Dフォルダ(ACIフォルダ)

上記の順番で、RonriKoboフォルダは探索され、最初に見つかったRonriKoboフォルダのみが採用されます。

7

RonrIKoboフォルダ内のJExternal_xxx.jarとJWorld_xxx.jarは、4Dから実行されるJavaメソッドを開発するための、クラスライブラリでもあります。

8

JExternal ver 4.1.1以降では、JExternalにより実行されるJavaメソッドは、それぞれの4Dプロセスに対応するネイティブスレッドで実行され、複数のJavaメソッドの並列処理が可能です。


JEX Call class method ( ClassName; MethodName; Params ) --> Status [ C_LONGINT ]

パラメタ

タイプ

説明

ClassName

C_STRING

Javaクラス名

MethodName

C_STRING

クラスメソッド名

Params

ARRAY POINTER

Javaメソッドへ渡すパラメタへのポインタが要素となっているポインタ配列

JEX Call class methodは、ClassNameで指定されるクラスのMethodNameで 指定されるクラスメソッドを実行します。

Paramsには、Javaメソッドへ渡すパラメタへのポインタが、要素となっているポインタ配列を指定してくださ い。Javaメソッドの実行後、Javaメソッドが返す値を、このポインタ配列の要素として受け取ることができます。この結果、このポインタ配列の要素 は、Javaメソッドの実行の前後で変化します。また、その配列のサイズも変化する可能性があります。

このメソッドは、実行が成功すると0を返します。エラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

関連項目:4DとJavaの型変換 JEX Call object method

サンプルコード

` TestClass1クラスの中のTestMethod1クラスメソッドを4Dから呼ぶ場合のコード
`

C_STRING(30;vName_S)
C_BOOLEAN
(vSex)
C_LONGINT
(vAge)
C_LONGINT
($Err)
`
vName_S:="Bill"
vSex:=True
`Male
ARRAY POINTER($Parameter;2)
$Parameter{1}:=->vName_S
`第1パラメタ
$Parameter{2}:=->vSex `第2パラメタ
$Err:=JEX Call class method("TestClass1";"TestMethod1";$Parameter)
If
($Err=0)
If(Size of array($Parameter) = 1)
If(Type($Parameter{1}->) = Is LongInt)
vAge:=$Parameter{1}->
`結果を受け取る
Else
ALERT("Error:JEX Call class method")
End if
Else
ALERT("Error:JEX Call class method")
End if
Else

ALERT("Error:JEX Call class method")
End if
` TestClass1クラスの中のTestMethod2クラスメソッドを4Dから呼ぶ場合のコード
`

C_TEXT(vName_T)
C_BOOLEAN
(vSex)
C_LONGINT
($Err)
`
vName_T:="Bill Clinton"
vSex:=
True `Male
ARRAY STRING(21;aHisCars_S;2)
aHisCars_S{1}:="Lincoln"
aHisCars_S{2}:="Porsche"

ARRAY POINTER
($Parameter;3)
$Parameter{1}:=->vName_T
`第1パラメタ
$Parameter{2}:=->vSex `第2パラメタ
$Parameter{3}:=->aHisCars_S `第3パラメタ
$Err:=JEX Call class method("TestClass1";"TestMethod2";$Parameter)
If
($Err=0)
If(Size of array($Parameter)=1)
If(Type($Parameter{1}->)=Text array)
ARRAY TEXT(aHisChildren;0)
COPY ARRAY($Parameter{1}->;aHisChildren) `結果として配列を受け取る
Else ALERT("Error:JEX Call class method")
End if Else
ALERT("Error:JEX Call class method")
End if
Else

ALERT("Error:JEX Call class method")
End if
` TestClass1クラスの中のTestMethod3クラスメソッドを4Dから呼ぶ場合のコード
`

C_TEXT(vName_T)
C_BOOLEAN
(vSex)
C_LONGINT
(vAge)
C_LONGINT
($Err)
`
vName_T:="Bill Clinton"
vSex:=
True `Male
ARRAY TEXT(aHisCars_T;2)
aHisCars_T{1}:="Lincoln"
aHisCars_T{2}:="Porsche"

ARRAY POINTER
($Parameter;3)
$Parameter{1}:=->vName_T
`第1パラメタ
$Parameter{2}:=->vSex `第2パラメタ
$Parameter{3}:=->aHisCars_T `第3パラメタ
$Err:=JEX Call class method("TestClass1";"TestMethod3";$Parameter)
If
($Err=0)
If(Size of array($Parameter)=2)
If(Type($Parameter{1}->)=Is LongInt) & (Type($Parameter{2}->)=Text array)
vAge:=$Parameter{1}->
`複数結果を受け取る-結果1
ARRAY TEXT(aHisChildren;0)
COPY ARRAY($Parameter{2}->;aHisChildren) `複数結果を受け取る-結果2
Else ALERT("Error:JEX Call class method")
End if
Else
ALERT("Error:JEX Call class method")
End if
Else

ALERT("Error:JEX Call class method")
End if
//Java TestClass1 Class
import java.lang.*;
import com.ronri_kobo.*;
import com.ronri_kobo.JExternal.*;

public class
TestClass1
{
public static int
TestMethod1( String255 name, boolean sex )
{
..........
..........
int age = 52;
return age;
}

public static String[]
TestMethod2( String name, boolean sex, String255[] hisCars )
{
..........
..........
String[] hisChildren = new String[3];
hisChildren[0] = "John";
hisChildren[1] = "Mary";
hisChildren[2] = "Mike";

return hisChildren;
}

public static Object[]
TestMethod3(String name, boolean sex, String[] hisCars)
{
..........
..........
int age = 52;

String[] hisChildren = new String[3];
hisChildren[0] = "John";
hisChildren[1] = "Mary";
hisChildren[2] = "Mike";

Object[] retArray = new Object[2];
retArray[0] = (Object)( new Integer( age ) );
retArray[1] = (Object)hisChildren;

return retArray;
}
}

JEX Call object method ( ObjectID; MethodName; Params ) --> Status [ C_LONGINT ]

パラメタ

タイプ

説明

ObjectID

C_LONGINT

Javaオブジェクトを識別するためのID番号

MethodName

C_STRING

インスタンスメソッド名

Params

ARRAY POINTER

Javaメソッドへ渡すパラメタへのポインタが要素となっているポインタ配列

JEX Call object methodは、ObjectIDで識別されるJavaオブジェク トの、MethodNameで指定されるインスタンス(オブジェクト)メソッドを実行します。

ObjectIDには、4DがJavaオブジェクトを識別するためのID番号(正の整数)を指定してください。ObjectIDを どのように獲得するかは、下記のサンプルコードを参照してください。

Paramsには、Javaメソッドへ渡すパラメタへのポインタが、要素となっているポインタ配列を指定してくださ い。Javaメソッドの実行後、そのJavaメソッドが返す値を、このポインタ配列の要素として受け取ることができます。この結果、このポインタ配列の要 素は、Javaメソッドの実行の前後で変化します。また、その配列のサイズも変化する可能性があります。

このメソッドは、実行が成功すると0を返します。エラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

関連項目:4DとJavaの型変換 JEX Call class method

サンプルコード

` TestClass2クラスの中のTestMethodインスタンスメソッドを4Dから呼ぶ場合のコード
`

C_STRING(30;vName_S)
C_BOOLEAN
(vSex)
C_LONGINT
(vAge)
C_LONGINT
($TargetObjetID)
C_LONGINT
($Err)
`
` JEX Call class methodでオブジェクトIDを獲得する

ARRAY POINTER($Parameter;0) `Javaメソッドに渡すパラメタはない
$Err:=JEX Call class method("TestClass2";"createMyself";$Parameter)
If
($Err=0)
If(Size of array($Parameter)=1)
If(Type($Parameter{1}->)=Is LongInt)
$TargetObjetID:=$Parameter{1}->
`オブジェクトのID番号を獲得する
`
vName_S:="Bill"
vSex:=True `Male
ARRAY POINTER($Parameter;2)
$Parameter{1}:=->vName_S
`第1パラメタ
$Parameter{2}:=->vSex `第2パラメタ
$Err:=JEX Call object method($TargetObjetID;"TestMethod";$Parameter)
If($Err=0)
If(Size of array($Parameter)=1)
If(Type($Parameter{1}->)=Is LongInt)
vAge:=$Parameter{1}->
`結果を受け取る
$Err:=JEX Free object($TargetObjetID)`このオブジェクトは、もう4Dでは必要ない
If($Err # 0)
ALERT("Error:JEX Free object")
End if Else ALERT("Error:JEX Call object method")
End if Else
ALERT("Error:JEX Call object method")
End if
Else ALERT("Error:JEX Call object method")
End if Else ALERT("Error:JEX Call class method")
End if
Else ALERT("Error:JEX Call class method")
End if
Else
ALERT("Error:JEX Call class method")
End if
//Java Class
import java.lang.*;
import com.ronri_kobo.*;
import com.ronri_kobo.JExternal.*;

public class
TestClass2
{
public TestClass2()
{
super();
}

public static int
createMyself()
{
TestClass2 obj = new TestClass2();
int objectID =
DBWorld.createObjectID( obj );
return objectID;
}

public int
TestMethod( String255 name, boolean sex )
{
..........
..........
int age = 52;
return age;
}
}

JEX Free object ( ObjectID ) --> Status [ C_LONGINT ]

パラメタ

タイプ

説明

ObjectID

C_LONGINT

Javaオブジェクトを識別するためのID番号

JEX Free objectは、ObjectIDで識別されるJavaオブジェクトを、もう4D では使用しないことを宣言します。Javaオブジェクトを4Dから使用する必要がなくなったときに、このプラグインメソッドを実行してください。このプラ グインメソッド実行後、ガベージコレクションによりそのオブジェクトは、メモリから消去される可能性があります。

このメソッドは、実行が成功すると0を返します。エラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

関連項目:JEX Call object method

サンプルコード

C_LONGINT($TargetObjetID)  `Javaオブジェクトの識別番号
C_STRING(30;vName_S)
C_BOOLEAN
(vSex)
C_LONGINT
(vAge)
C_LONGINT
($Err)
..........
..........
vName_S:="Bill"
vSex:=True `Male

ARRAY POINTER
($Parameter;2)
$Parameter{1}:=->vName_S
`第1パラメタ
$Parameter{2}:=->vSex `第2パラメタ
$Err:=JEX Call object method($TargetObjetID;"TestMethod";$Parameter)
If
($Err=0)
If(Size of array($Parameter)=1)
If(Type($Parameter{1}->)=Is LongInt)
vAge:=$Parameter{1}->
`結果を受け取る
$Err:=JEX Free object($TargetObjetID) `このオブジェクトは、もう4Dでは必要ない
If($Err # 0)
ALERT("Error:JEX Free object")
End if
Else ALERT("Error:JEX Call object method")
End if Else ALERT("Error:JEX Call object method")
End if
Else
ALERT("Error:JEX Call object method")
End if

JEX Set environment ( JVM_ID; License ) --> Status [ C_LONGINT ]

パラメタ

タイプ

説明

JVM_ID

C_LONGINT

JWD create java worldが返すJavaバーチャルマシンのID番号

License

C_STRING

デモ版と製品版を区別するための文字列

JEX Set environmentは、JExtetnalが動作するための基本的環境を整えます。このプラグ インメソッドをエラーなく実行しない限り、他のJExtetnalのプラグインメソッドは、すべてエラー(エラー番号-18021)になります。通常この メソッドは、 On Startupで実行します。

JVM_IDには、JWD create java worldが返し たJavaバーチャルマシンの識別番号を指定してください。

Licenseには、"PRODUCT"または"TRIAL"のどちらかの文字列を指定してください。

"PRODUCT"を指定すると、次回の4Dの起動からライセンスキーコードを入力する画面が表示されます。"TRIAL"を指定 すると、試用時間が60分に制限されたデモ版として動作します。

このメソッドは、実行が成功すると0を返します。エラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

関連項目:JWD create java world

サンプルコード

`通常 On Startupで、次のように記述する
`

C_LONGINT($JVM_ID)
C_LONGINT
($Err)
`
$JVM_ID:=JWD Create java world("")`Javaバーチャルマシンを起動する

If($JVM_ID>0)
$Err:=JEX Set environment($JVM_ID;"PRODUCT")
`デモ版では"PRODUCT"の代わりに"TRIAL"を使用する
If($Err # 0)
ALERT("Error:JEX Set environment")
End if
Else

ALERT("Error:JWD Create java world")
End if

JWorld

JWorldは、Javaバーチャルマシンを起動するためのプラグインであり、JExternalにとって必須のものです。 JWorldには、次のようなプラグインメソッドがあります。

JWD Create java world
JWD Close java world
JWD Convert line separator
JWD Set JVM options (JWorld version 4.1.1 以降)

Mac OS Xでは、Javaバーチャルマシンはシステムにビルトインされています。

Windowsでは、サンマイクロシステムズ社のJ2SE(Java2 Platform Standard Edition)を使用します。サンマイクロシステムズ社のWebサイトから、最新版のJ2SEを入手してインストールしてください。J2SEには、 JREとJDKの2種類ありますが、どちらも使用できます。

Javaバーチャルマシンを起動する機能は、他のプラグインJbyJでも同様に必要なため、そのプラグインと共有できるように、JExternalの中に含めずJWorldとして独立しています。

JWD Create java world ( JVM_Path ) --> JVM_ID [ C_LONGINT ]

パラメタ

タイプ

説明

JVM_Path

C_STRING

JavaバーチャルマシンDLLへのパス(Windows)

JWD Create java worldは、Javaバーチャルマシン(JVM)を起動し、そのJavaバー チャルマシンの識別番号(正の整数)を返します。

JVM_PathとしてWindowsでは、"jvm.dll"までのフルパス名、またはそのフルパス名を設定して いる環境変数を指定してください。ブランク("")が指定された場合は、環境変数「JVMDLL_PATH」が指定されたものと見なされます。

JWorldバージョン3.1.0以降では、JVM_Pathにブランク("")が指定され、しかも環境変数 「JVMDLL_PATH」が存在しない場合、Javaバーチャルマシンのインストール時に設定されたレジストリを参照します。最初に、 HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime EnvironmentにあるCurrentVersionキーからJavaバーチャルマシンの現在のバージョンを取得し、次に HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\(現在のバージョン)にあるRuntimeLibキーからjvm.dllのパスを取得します。

"jvm.dll"までのフルパス名の例

JRE 1.6.0_02

"C:\Program Files\Java\jre1.6.0_02\bin\client\jvm.dll"

JDK 1.6.0_02

"C:\Program Files\Java\jdk1.6.0_02\jre\bin\client\jvm.dll"

Mac OSでは、JVM_Pathは無視され、現在コンピュータにインストールされているアップル社のJava バーチャルマシンが起動さ れます。

Javaバーチャルマシンが正しくインストールされていれば、WindowsとMac OS共通で、ブランク("")がJVM_Pathとして指定できます。

このプラグインメソッドは、4th Dimensionまたは4D Clientでは、通常、On Startupで使用します。4D Serverでは、On Server Startupから起動される別プロセスで使用してください。

4D Clientで使用する場合は、このプラグインメソッドを呼ぶ前に、4D Server上にあるJavaClassesフォルダやRonriKoboフォルダを、4D Clientにコピーしておきます。4D Clientでの利用を参照して ください。

このメソッドでエラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

サンプルコード

`4Dまたは4D Clientの場合の On Startup
`
`**** For 4D Client ****

If(Application type=4D Client)
`4D Clientのときは、ここでJavaClassesとRoniKoboフォルダの中のファイルを
`4D Serverから4D Clientにコピーする処理行う
End if
`
C_LONGINT($JVM_ID)
C_LONGINT
($Err)
`
$JVM_ID:=JWD Create java world("")
If($JVM_ID>0)
$Err:=JEX Set environment($JVM_ID;"PRODUCT")
If($Err # 0)
ALERT("Error:JEX Set environment")
End if
Else
ALERT("Error:JWD Create java world")
End if
`4D Serverの場合の On Server Startup
`別プロセスを起動する

`
C_LONGINT($Proc)
$Proc:=
New process("SETUP_JEXTERNAL";64000;"$SETUP_JEXTERNAL")
While
(Process state($Proc)>=0)
IDLE
DELAY PROCESS(Current process;60)
End while
`On Server Startupとは別プロセスで実行される"SETUP_JEXTERNAL"
`
C_LONGINT($JVM_ID)
C_LONGINT
($Err)
`
$JVM_ID:=JWD Create java world("")
If($JVM_ID>0)
$Err:=JEX Set environment($JVM_ID;"PRODUCT")
If($Err # 0)
ALERT("Error:JEX Set environment")
End if
Else
ALERT("Error:JWD Create java world")
End if

JWD Close java world --> Status [ C_LONGINT ]

パラメタ

タイプ

説明

なし



JWD Close java worldは、4D ServerのOn Server Shutdownで実行し、正常に4D Serverを終了させるためのプラグインメソッドです。4D Serverでこのメソッドを実行せずに終了した場合は、終了までに余分な時間がかかる場合があります。

4th Dimensionまたは4D Clientでは、必ずしもOn Exitでこのメソッドを実行する必要はありません(実行しても問題ありません)。

このメソッドでエラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

サンプルコード

`On Server Shutdown
`

C_LONGINT($Err)
$Err:=JWD Close java world

JWD Convert line separator ( ON_or_OFF ) --> Status [ C_LONGINT ]

パラメタ

タイプ

説明

ON_or_OFF

C_BOOLEAN

行区切りコードの変換のオン/オフを指定する

JWD Convert line separatorに、引数としてTRUEを指定すると、4DからJavaに文 字列が渡されるとき、自動的に4Dの行区切りコードCRをJavaの行区切りコードLFに変換します。また、Javaから4Dに戻される文字列の中に Javaの行区切りコードLFがあれば、自動的に4Dの行区切りコードCRに変換します。

このメソッドに、引数としてFALSEを指定すると、上記の変換は行われません。JWorldプラグイン起動直後は、このメソッド にFALSEを指定した状態になっています。

このメソッドでエラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

サンプルコード

C_LONGINT($Err)
C_BOOLEAN
($Switch)
$Switch:=
TRUE
$Err:=JWD Convert line separator($Switch)

JWD Set JVM options ( Options ) --> Status [ C_LONGINT ]   JWorld ver 4.1.1以降で有効

パラメタ

タイプ

説明

Options

ARRAY TEXT

JVM起動オプションを要素とする配列

JWD Set JVM optionsは、Javaバーチャルマシンの起動オプションを設定するために使用します。起動オプションを要素とした配列を引数として指定してください。JWD Set JVM optionsは、JWD Create java worldを実行する前に呼び出してください。

このプラグインメソッドは、JWorld ver 4.1.1以降で使用できます。リソースにJavaバーチャルマシンの起動オプションを設定する方法も引き続き有効です。両者を併用できます。

Javaバーチャルマシンの起動オプション

このメソッドでエラーが発生した場合は、エラー番号(負の整数)を返します。エラー番号を参照してください。

サンプルコード

C_LONGINT($Err)
C_LONGINT($JVM_ID)

ARRAY TEXT($aOptions;2)
$aOptions{1}:="-Xms128M"
$aOptions{2}:="-Xmx128M"
$Err:=
JWD Set JVM options($aOptions)
If ($Err=0)
 $JVM_ID:=
JWD Create java world("")
 ...
End if

Javaクラスライブラリ

RonriKoboフォルダにあるJExternal_xxx.jarとJWorld_xxx.jarは、4Dから実行する Javaメソッドを作成するためのクラスライブラリでもあります。

これらのクラスライブラリを利用して、4D独自のタイプのパラメタをJavaメソッドに渡したり、コールバック機能(Javaメソッ ドから4Dメソッドを実行すること)を持つJavaメソッドを作成することができます。

ライブラリには、次ぎようなクラスがあります。


com.ronri_kobo.JExternal.DBWorld

(JExternal_xxx.jar)

com.ronri_kobo.Time

(JWorld_xxx.jar)

com.ronri_kobo.Date

(JWorld_xxx.jar)

com.ronri_kobo.String255

(JWorld_xxx.jar)

com.ronri_kobo.Picture

(JWorld_xxx.jar)

com.ronri_kobo.JExternal.InvalidProcessNoException

(JExternal_xxx.jar)

com.ronri_kobo.JExternal.InvalidMethodNameException

(JExternal_xxx.jar)

com.ronri_kobo.JExternal.InvalidParametersException

(JExternal_xxx.jar)


クラス com.ronri_kobo.JExternal.DBWorld

java.lang.Object   
|
+----com.ronri_kobo.JExternal.DBWorld

public class DBWorld extends java.lang.Object

このクラスは、コールバック機能を利用するときや4D上でJavaオブジェクトを識別するためのIDを獲得するときに利用されるメ ソッドを提供しています。

コンストラクタ DBWorld

public DBWorld(int processNo) 
throws com.ronri_kobo.JExternal.InvalidProcessNoException

このメソッドは、DBWorldクラスのコンストラクタで、DBWorldクラスのオブジェクトの生成と初期化を行います。

processNoには、4Dへのコールバックが行われたときに、その4Dメソッドが実行されるプロセス番号を指定 してください。

クラスメソッド createObjectID

public static synchronized int createObjectID(java.lang.Object obj)

このメソッドは、objで指定されるJavaオブジェクトのオブジェクトIDを返します。4Dはこのオブジェクト IDを使用して、JEX Call object methodを 実行します。JEX Free objectが 実行されるまで、このオブジェクトはガベージコレクションされることはありません。

クラスメソッド alert

public static synchronized void alert(java.lang.String message)

このメソッドは、4DのALERTコマンドのように、アラートウィンドウにパラメタで指定されたメッセージを表示します。このメ ソッドは、Javaのデバッグもに使用されます。

インスタンスメソッド call4DMethod

public java.lang.Object call4DMethod(java.lang.String methodName, java.lang.Object parameter[]) 
throws com.ronri_kobo.JExternal.InvalidMethodNameException, com.ronri_kobo.JExternal.InvalidParametersException

このメソッドは、methodNameで指定される4Dメソッドを実行(コールバック)します。4Dメソッドは、コ ンストラクタDBWorldでオブジェ クトを生成するときに指定したプロセスで実行されます。

プラグインメ ソッドJEX Call class methodまたはJEX Call object methodは、Javaメソッドの実行終了を待つ間、Javaからのコールバックを常に監視しており、コールバックメソッドは、これらのプラグインメ ソッドによって呼び出されます。

parameter[]には、コールバックメソッドに渡すパラメタを要素としたObjectクラスの配列を指定して ください。int型やdouble型などのプリミティブ型のパラメタを渡す場合は、それらのラッパ−オブジェクトを作成してから、配列の要素としてくださ い。

このメソッドは、返り値として4Dの$0に対応した1つのObjectクラスのオブジェクトを返します。必要に応じて、そのオブ ジェクトをキャストあるいはアンラップして、返り値を獲得してください。

コールバックメソッドで複数の値を返したい場合は、それらの値へのポインタを要素とするポインタ配列へのポインタを返してくださ い。Javaでは、返されたObjectクラスのオブジェクトを、まずObjectクラスの配列にキャストし、その配列の要素を必要に応じて、アンラップ またはキャストすることで、4Dからの複数の返り値を取り出すことができます。

弊社Webサイトからダウンロードできるデモ「JEX_SimpleDemo_xxx」を参照してください。

関連項目:4DとJavaの型変換

サンプルコード

` TestClassクラスの中のTestMethodインスタンスメソッドを4Dから呼ぶ場合のコード
` コールバックが発生する
`
C_STRING(vProcessNo)
C_LONGINT
($TargetObjetID)
C_LONGINT
($Err)
`
` JEX Call class methodでオブジェクトIDを獲得する

vProcessNo:=Current process `コールバックのためにプロセス番号を得る
ARRAY POINTER($Parameter;1)
$Parameter{1}:=->vProcessNo
`第1パラメタ プロセス番号
$Err:=JEX Call class method("TestClass";"createMyself";$Parameter)
If
($Err=0)
If(Size of array($Parameter)=1)
If(Type($Parameter{1}->)=Is LongInt)
$TargetObjetID:=$Parameter{1}->
`オブジェクトのIDを獲得する
`
`コールバックが発生し、4Dメソッド QueryAgeが実行される
ARRAY POINTER($Parameter;0)
$Err:=JEX Call object
method($TargetObjetID;"testMethod";$Parameter)
If($Err#0)
ALERT("Error:JEX Call object method")
End if Else
ALERT("Error:JEX Call class method")
End if
Else ALERT("Error:JEX Call class method")
End if
Else
ALERT("Error:JEX Call class method")
End if
//Java Class
import java.lang.*;
import com.ronri_kobo.*;
import com.ronri_kobo.JExternal.*;

public class
TestClass
{
static DBWorld dbWorld;

/**************************/
// Constructor
/**************************/

public TestClass()
{
super();
}

/**************************/
// createMyself
/**************************/

public static int
createMyself( int processNo )
{
int objectID;

createDBWorld( processNo );
TestClass obj = new TestClass();
objectID = DBWorld.
createObjectID( obj );

return objectID;
}

/**************************/
// createDBWorld
/**************************/

public static void
createDBWorld( int processNo )
{
try{
dbWorld = new
DBWorld( processNo );
}
catch( InvalidProcessNoException e ){
DBWorld.
alert( "An InvalidProcessNoException occurred" );
}
}

/**************************/
// callback
/**************************/

public Object
callback( String callbackMethodName, Object params[] )
{
Object result = null;
try{
result = dbWorld.
call4DMethod( callbackMethodName, params );
}
catch( InvalidMethodNameException e ){
DBWorld.
alert( "An InvalidMethodNameException occurred." );
}
catch( InvalidParametersException e ){
DBWorld.
alert( "An InvalidParametersException occurred." );
}
return result;
}

/**************************/
// testMethod
/**************************/

public void
testMethod()
{
boolean sex = false;
// 女性
String name = "Monica";
Object[] params = new Object[ 2 ];
params[ 0 ] = new Boolean( sex );
// 第1パラメタ
params[ 1 ] = name; // 第2パラメタ
Object resultObj = callback( "QueryAge", params );
if( resultObj != null )
int herAge = ( (Integer)resultObj ).intValue();
// 結果を受け取る
..........
..........
}
}
`コールバックされる4Dメソッド QueryAge
`

C_BOOLEAN($1) `性
C_TEXT($2) `名前
`
QUERY([Personnel];[Personnel]Sex=$1;*)
QUERY([Personnel]; & ;[Personnel]Name=$2)
`
C_LONGINT($0) `年齢
$0:=[Personnel]Age

クラス com.ronri_kobo.Time

java.lang.Object
|
+----com.ronri_kobo.Time

public class Time extends java.lang.Object implements java.io.Serializable

このクラスは、4DのTIME型に対応するJavaクラスです。

コンストラクタ Time

public Time(int hour, int min, int sec)

このメソッドは、Timeクラスのコンストラクタで、Timeクラスのオブジェクトを生成し、パラメタで指定された値(時間 (0-23)、分 (0-59)、秒 (0-59))でそのオブジェクトを初期化します。

インスタンスメソッド getHours

public int getHours()

このメソッドは、Timeクラスのオブジェクトの「時間」を返します。

インスタンスメソッド getMinutes

public int getMinutes()

このメソッドは、Timeクラスのオブジェクトの「分」を返します。

インスタンスメソッド getSeconds

public int getSeconds()

このメソッドは、Timeクラスのオブジェクトの「秒」を返します。

インスタンスメソッド setHours

public void setHours(int hour)

このメソッドは、Timeクラスのオブジェクトに「時間」をセットします。

インスタンスメソッド setMinutes

public void setMinutes(int min)

このメソッドは、Timeクラスのオブジェクトに「分」をセットします。

インスタンスメソッド setSeconds

public void setSeconds(int sec)

このメソッドは、Timeクラスのオブジェクトに「秒」をセットします。


クラス com.ronri_kobo.Date

java.lang.Object
|
+----com.ronri_kobo.Date

public class Date extends java.lang.Object implements java.io.Serializable

このクラスは、4DのDATE型に対応するJavaクラスです。

コンストラクタ Date

public Date(int year, int month, int date)

このメソッドは、Dateクラスのコンストラクタで、Dateクラスのオブジェクトを生成し、パラメタで指定された値(年(0- 32767)、月(1-12)、日 (1-31))でそのオブジェクトを初期化します。

インスタンスメソッド getYear

public int getYear()

このメソッドは、Dateクラスのオブジェクトの「年」を返します。

インスタンスメソッド getMonth

public int getMonth()

このメソッドは、Dateクラスのオブジェクトの「月」を返します。

インスタンスメソッド getDate

public int getDate()

このメソッドは、Dateクラスのオブジェクトの「月」を返します。

インスタンスメソッド setYear

public void setYear(int year)

このメソッドは、Dateクラスのオブジェクトに「年」をセットします。

インスタンスメソッド setMonth

public void setMonth(int month)

このメソッドは、Dateクラスのオブジェクトに「月」をセットします。

インスタンスメソッド setDate

public void setDate(int date)

このメソッドは、Dateクラスのオブジェクトに「日」をセットします。


クラス com.ronri_kobo.String255

java.lang.Object
|
+----com.ronri_kobo.String255

public class String255 extends java.lang.Object implements java.io.Serializable

このクラスは、4DのSTRING型に対応するJavaクラスです。

コンストラクタ String255

public String255(java.lang.String str)

このメソッドは、String255クラスのコンストラクタで、String255クラスのオブジェクトを生成し、パラメタで指定 された文字列でそのオブジェクトを初期化します。指定された文字列が255バイトを超えた場合は、255バイトにカットします。

インスタンスメソッド getString

public java.lang.String getString()

このメソッドは、現在のString255クラスのオブジェクトをStringクラスのオブジェクトに変換して、それを返します。

インスタンスメソッド setString

public void setString(java.lang.St

このメソッドは、指定されたバイト配列をString255クラスのオブジェクトに変換して、それを現在のString255クラ スのオブジェクトと入れ替えます。


クラス com.ronri_kobo.Picture

java.lang.Object
|
+----com.ronri_kobo.Picture

public class Picture extends java.lang.Object implements java.io.Serializable

このクラスは、4DのPICTURE型に対応するJavaクラスです。

コンストラクタ Picture

public Picture(byte picture[])

このメソッドは、Pictureクラスのコンストラクタで、Pictureクラスのオブジェクトを生成し、パラメタで指定されたバ イト配列でそのオブジェクトを初期化します。

インスタンスメソッド getBytes

public byte[] getBytes()

このメソッドは、現在のPictureクラスのオブジェクトをバイト配列に変換して、それを返します。

インスタンスメソッド setBytes

public void setBytes(byte picture[])

このメソッドは、 指定されたバイト配列をPicture クラスのオブジェクトに変 換して、それを現在のPicture クラスのオブジェクトと入れ替えます。


クラ ス com.ronri_kobo.JExternal.InvalidProcessNoException

java.lang.Object
|
+----java.lang.Throwable
|
+----java.lang.Exception
|
+----com.ronri_kobo.JExternal.InvalidProcessNoException

public class InvalidProcessNoException extends java.lang.Exception

この例外は、DBWorldクラスのコンストラクタDBWorldにおいて、不正な4Dプロセス番号を指定したときに発生します。

コンストラクタ InvalidProcessNoException

 public InvalidProcessNoException()


ク ラス com.ronri_kobo.JExternal.InvalidMethodNameException

java.lang.Object
|
+----java.lang.Throwable
|
+----java.lang.Exception
|
+----com.ronri_kobo.JExternal.InvalidMethodNameException

public class InvalidMethodNameException extends java.lang.Exception

この例外は、DBWorldクラスのインスタンスメソッドcall4DMethodにおいて、不正な4Dメソッド名を指定したときに発生します。

コンストラクタ InvalidMethodNameException

 public InvalidMethodNameException()


ク ラス com.ronri_kobo.JExternal.InvalidParametersException

java.lang.Object
|
+----java.lang.Throwable
|
+----java.lang.Exception
|
+----com.ronri_kobo.JExternal.InvalidParametersException

public class InvalidParametersException extends java.lang.Exception

この例外は、DBWorldクラスのインスタンスメソッドcall4DMethodにおいて、4Dメソッドへの不正なパラメタを指定したときに発生 します。

コンストラクタ InvalidParametersException

public InvalidParametersException()


Javaバーチャ ルマシンの起動オプション

JWorldバージョン3.1.0以降では、JWorldのリソースSTR#を編集することにより、Javaバーチャルマシンの起動オプションを設定することができます。
Mac OS Xの起動オプションは、15903番のSTR#を編集します。デフォルトで
-Djava.awt.headless=trueというオプションが設定されています。
Windowsの起動オプションは、15904番のSTR#を編集します。デフォルトで
#-Djworld.stdout.redirect=trueというオプションが設定されています。行の最初の文字が「#」であれば、その行のオプショ ンは無効です。有効にするためには、「#」を取り除いてください。起動オプションは、15903番または15904番のSTR#のインデックス1から10 まで最大10個設定することができます。

(注意1)
Mac OS 8/9ではJavaバーチャルマシンの起動オプションを設定することはできません。起動オプションが有効になるのは、Mac OS XとWindowsです。

(注意2)
起動オプションを設定することにより、Javaで使用するメモリ領域の初期値(-Xmsオプション)や最大値(-Xmxオプション)等を変更することがで きます。
参照:
Java HotSpot VM Options (Sun Microsystems)
Java Virtual Machine Options (Apple)

(注意3)
リソースを編集するためには、Macintosh上でResEditを使用します。Macintoshでリソースを編集後、4D TransporterでWindows用のリソースファイルを作成します。直接Windowsのリソースファイルを編集するツールもあります。
http://www.orchardsoft.com/news_links/4Dapps/resource_editor.htm

(注意4)
Mac OS Xで起動オプション-Djava.awt.headless=trueを設定せずに、Javaバーチャルマシンを起動すると、java.awtパッケージ のAPIがコールされた段階で4Dはクラッシュあるいはフリーズします。この起動オプションは、build 1.4.1_01-69.1以降のJavaバーチャルマシンで有効になります。Mac OS Xでは、必ずこのオプションを設定してJavaバーチャルマシンを起動してください。

(注意5)
Windowsでは、標準出力のためのコンソールが存在しないので、標準出力をリダイレクトしない限り、System.out.println()等の結果を確認することはできません。標準出力をリダイレクトするためには、-Djworld.stdout.redirect=trueというオプションを設定してJavaバーチャルマシンを起動してください。そうすることにより、System.out.println()等の結果は、ストラクチャファイルが あるフォルダの「jworldout.txt」というテキストファイルに出力されるようになります。

(注意6)
JWorldバージョン4.1.1以降では、プラグインメソッドJWD Set JVM optionsでもJavaバーチャルマシンの起動オプションを設定することができます。両者を併用できます。


4D Clientでの利用

JExternalバージョン4.0.1以降を使用する場合は、「4D Clientでの利用」の記述を無視してください。4D 2004から採用された新しいプラグインアーキテクチャーでは、JExternal_4xx.bundleの中のContentsフォルダ内のすべてのファイル/フォルダは、自動的に4D Clientにダウンロードされます。ContentsフォルダにRonriKoboフォルダとJavaClassesフォルダを配置すれば、自分で4D Clientにダウンロードする必要はありません。

JExternalを4D Clientで使用する場合、他のプラグイン同様、Mac4DXあるいはWin4DXフォルダ内のプラグインファイルは、4D Serverからクライアントに自動的にコピーされるのですが、RonriKoboフォルダとJavaClassesフォルダ内のファイルは、自動的にコピーされません。したがって、これらのファイルを手作業でクライアントにコピーするか、JExternalのデモで行っているように、サーバからクライア ントにファイルをコピーするためのメソッドを用意しなければなりません。コピーは、JWD Create java worldが実行される前に行われていなければなりません。したがって、通常、On Startupで行います。

バージョン3.1.0のデモでは、下記のメソッドがRonriKoboフォル ダとJavaClassesフォルダ内のファイルをサーバからクライアントにコピーするために使用されています。参考にしてください。
  • U_DOWNLOADFILES --- JAVA_SetupJExternalから呼ばれています
  • SP_GETFILELIST --- ストアドプロシージャ
  • SP_DOWNLOADFILE --- ストアドプロシージャ
4D Clientでは、RonriKoboフォルダとJavaClassesフォルダは、次のフォルダに配置します。
  1. 4Dフォルダ内のストラクチャファイルと同名のフォルダ(4D Client 6.7以降)
  2. アプリケーションファイル(4D Client)があるフォルダ
  3. 4Dフォルダ(ACIフォルダ)

上記の順番で、RonriKoboフォルダとJavaClassesフォルダは探索され、最初に見つかったもののみが採用されま す。
なお、1. は、バージョン6.7以降の4D Clientが自動的作成するフォルダです。バージョン6.0/6.5では、このフォルダは作成されませ ん。バージョン6.0/6.5では、RonriKoboフォルダまたはJavaClassesフォルダを2. または3. のフォルダに配置してください。

 


4DとJavaの型変換

4DからJavaメソッドに渡すパラメタは、自動的に下記の変換(->)が行 われて、Javaメソッドに渡たされます。Javaメソッドが返す値も、自動的に変換(<-)が行われて、4Dに返えされます。

コールバックの場合、Javaから4Dメソッドに渡すパラメタは、自動的に変換 (<-)が行われて、4Dメソッドに渡たされます。4Dメソッドが返す値も、自動的に変換(->)が行われて、Javaに返えされます。

4D


Java

C_BOOLEAN

<->

boolean

C_INTEGER

->

int

C_LONGINT

<->

int

C_REAL

<->

double

C_TIME

<->

com.ronri_kobo.Time

C_DATE

<->

com.ronri_kobo.Date

C_STRING

<->

com.ronri_kobo.String255

C_TEXT

<->

java.lang.String

C_PICTURE

<->

com.ronri_kobo.Picture

C_BLOB

<->

byte[]

ARRAY BOOLEAN

<->

boolean[]

ARRAY INTEGER

<->

short[]

ARRAY LONGINT

<->

int[]

ARRAY REAL

<->

double[]

ARRAY DATE

<->

com.ronri_kobo.Date[]

ARRAY STRING

<->

com.ronri_kobo.String255[]

ARRAY TEXT

<->

java.lang.String[]

ARRAY PICTURE

<->

com.ronri_kobo.Picture[]


エラー番号

-15901

Javaセッションをオープンできない

-15902

4Dのバージョンが古すぎる

-15903

68K Macintoshを使用している

-15904

Mac OSのバージョンが古すぎる

-15905

MRJのバージョンが古すぎる

-15906

JWorld_xxx.jarが見つからない



-15920

まだJavaセッションがオープンされていない

-15922

JWorldのための基本Javaクラスが見つからない

-15923

JWorldのための基本Javaメソッドが見つからない

-15924

libJWorld.jnilibが見つからない

-15925

Securityポリシーファイルが見つからない

-15926

クラスパス設定時にエラーが発生した

-15927

クラスパス設定のためのメモリが確保できない

-15928

JavaVMの起動に失敗した

-15929

JavaDLLにJavaVMの起動のためのメソッドが見つからない

-15930 jvm.dllが見つからない
-15931 JavaVMが古すぎる。Windowsでは、JDK1.2以上が必要。


-17002

不正なクラス名が指定された

-17003

不正なメソッド名が指定された

-17005

指定されたパラメタ配列がポインタ配列ではない



-17301

Javaメソッド実行中エラーが発生した

-17302

Javaオブジェクトを特定できない



-18000

デモ版で60分以上使用している

-18007

JExternal_xxx.jarが見つからない

-18010

JExternalのための基本Javaクラスが見つからない

-18011

JEternalのための基本Javaメソッド が見つからない

-18012

不正なJVM IDが指定された



-18021

JEX Set environmentの前に他のプラグインメソッドを実行している

-18022

Javaメソッドへ不正なパラメタが指定された

-18023

必要なメモリが確保できない-1

-18024

必要なメモリが確保できない-2

-18025

必要なメモリが確保できない-3

-18029

不正な戻り値を受け取った


制限事項

1

Javaメソッドから受け取ることができる戻り値の数は、最大99です。

2

コールバックで4Dへ渡すことができるパラメタの数は、最大99です。

3

4DとJavaの間で2次元配列の受け渡しはできません。

4

コールバックされた4Dメソッドの中で、再びJavaメソッドをコールすることはできません。

5

Javaメソッドでは、ウィンドウを含むいかなるユーザインタフェースコンポーネントも使用することはできません。

6

プラグインファイルJWorld_xxx.4DXのファイル名を変更することはできません。


Copyright (c) Ronri Kobo, Inc. All rights reserved.