Java programmingTips 松浦健一郎 ( ひぐべん工房 ) 第 14 回 Java NativeInterface (JNI) その 2 今回は前回に引き続き , JN について解説します。 JNI& は , Java プログラムとプラットホーム依存のネ イティブプログラムの間を接続するインタフェイスです。今回は JNI を用いて , Java のオブジェクトや配 列を , Java プログラムとネイティブプログラムとの間でやりとりする方法を解説します。またその応用と して , 前回作成した簡易 CD プレイヤーの機能を拡張します。 それではコンパイル方法を説明します。 ndard Edition, Ver. 1.3.0 ( 以下 JDKI. 3 ) を使 Java プログラムーネイティブ 用しました。 プログラム間のデータ交換 手順 1 javac JNITest3. java 最初にコマンドプロンプト ( または DOS 前回 , Java プログラムからネイテイププ 手順 2 ログラムに対して引数で文字列 ( String ) を プロンプト ) で以下のコマンドを実行して , 渡し , ネイテイププログラムの中で表示す Java プログラム (List 1 ) をコンパイルしま 次に JDKI. 3 の中の javah というツール を用いて , ヘッダファイル ( 付録 CD - ROM るプログラムの例を説明しました。また , す。 に収録の「 JNITest3. h 」 ) を生成します。 今回 , すべての Java プログラムのコンパ 逆に , ネイテイププログラムの中で文字列 を生成し , Java プログラムに返す方法も解 イルと実行に Windows 用の Java2 SDKSta javah -jni JNITest3 説しました。実際のアプリケーションでは , オプジェクト・配列の受け渡しの例 ( Java プログラム , JNITest3. java) 文字列だけではなく , さまざまなデータを Java プログラムとネイテイププログラムの 間でやりとりする必要があります。 JNI には , このようなデータ交換のため の仕組みがあります。今回はとくに Java プログラムにおけるオプジェクトの各フィ ールド ( メンノヾ変数 ) にアクセスする方法や , 配列データを読み書きする方法を中心に解 説します。 トオブジェクトや配列の受け渡し ListI, 2 は , Java プログラム←ネイティ ププログラム間でオプジェクトや配列を受 け渡しするプログラムの例です。 Java プロ グラム側で定義したオプジェクトや配列 を , C プログラム側で読み書きします。具 体的には , Java プログラムが初期化したオ プジェクトや配列の値を , C プログラムが 読み出して表示します。続いて C プログラ ムがオプジェクトや配列の値を変更し , Ja va プログラムに戻って , 変更後の値を Java プログラムが表示します。 1 26 C MAGAZINE 2001 9 List import java. awt.*; - I のテスト ( オブジェクトや配列の受け渡し ) public class JNITest3 { / / int 型 土 n し a ー / / char 型、 static static char b ー 〃 do 面厄型配列 dO cl ーネイティブメソッドの宣言 public native vo su わ ( 加 0 0 - DLL のロード stat ic { $ystem.loadLibrary("JNITest3Ext"); メインルーチン public static VOid main(String[ ] args) new JNITest3( - コンストラクタ public JNITest3( ) { - 変数の初期化 b 記・ c=new d0 曲 [ 2 c [ 0 ] = 0. c [ 1 ト 0. point p=new 印加 # は - ネイティブメソッドの呼び出し - 変更された変数値の表示 system. ou し printl n ( : a=n 十 a 十 Java , b = ”十 b 十 c [ 0 ] = ″十 c [ 0 ] 十 % c [ 1 ト″十 c [ 1 ] + ー P = ( ” + P. x 十 % ″十 P. Y 十つ″
スタートアッフ Ja a Java 言語事始 第 0 回 メソッドとバッケージ 毛呂宗夫 Java はオブジェクト指向言語です。今回はこれまでの連載で 断片的になっていた「メソッド」について解説してみます。 だってあるのですが , Java の場合はより深 >java Nikka Java の難しさ 刻です。 1 階から出る柱が絡み合っている とやるとエラーが出てしまいます。実行す からです。 るにはもう 1 つ , クラスファイルをパッケ ージ名と同じティレクトリに入れることが この世のことは何だって難しいのです。 だからといって , 1 階を済ませてから 2 C だって C + + だって難しい。 Java も簡単で 階に取りかかるというのは , 「 C を習って 必要です。たとえば前述の whisky パッケ から Java を習え」ということになるのでそ はありません。それぞれ難しいのだけれど , ージなら , 今いるディレクトリ ( カレント Java には Java なりの難しさがあります。 れは避けたい。それに C から始めると「オプ ディレクトリ ) の下に whisky というディレ ジェクト指向」の感覚をつかむのにより苦 Java は C に似せて作られました。同じで クトリを作り , その中にクラスファイルを かまわない部分は同じであり , その上に Ja 労するのではないかという心配もあります。 置きます。また , 実行も以下のようにしま va 特有の要素が組み立てられています。 C これまでは , オプジェクトを先に見てき す。 + + と同様に , Java の構造は 2 階建てです。 ました。ただしその過程でメソッドについ >java whisky. Nikka もっとも Java の場合 , 1 階の一部を取り壊 ての話が断片的になってしまったので , まとめると , クラスをパッケージに入れ している点で C + + とは違うのですが , しか こでまとめて解説します。また , メソッド るためには , しやつばり 2 階建てです。それも縦に重な ( 1 ) ソースファイルの先頭にパッケージ のアクセス可能性の説明のためにパッケー っているのではなく , 1 階を支えるのに 1 ジの知識が必要なので , まずそれをお話し 言をする ( 2 ) クラスファイルを , パッケージ名と 階のあちこちから柱が伸びています。 ましよう。 筆者は C の後で Java を習いました。その 同じディレクトリに置く バッケージ 目で見ると Java の構造はよくわかるし , 美 が必要になります。なお , 最初からパッケ しいとさえ思います。ただ , プログラミン ージ名と同じディレクトリにソースファイ プログラムが大規模になると , 「いくつ グを初めて習う人にとってどうなのか , ち ル ( 拡張子が .java のファイル ) を置いてコン ょっと想像しにくいところがあります。 かの部分に分けて構造をすっきりさせた パイルすることもできます。普通はそうす Java の話をしていて困るのは , 概念が循 い」という要求が生じます。 Java ではクラ るほうが多いでしよう。つまり whisky デ 環してしまうことです。一例をあげると , スファイルを「パッケージ」という単位にま ィレクトリに Nikka.java を置いて , とめることができます。 「データ型について説明しよう。データ型 >javac whisky%Nikka. java にはクラスも含まれるからクラスの説明が とします。この場合も実行は , ソースファイルの先頭にパッケージ亘言 必要だ。クラスにはメソッドが含まれるか をします。 List 1 の 1 行目のようにすると , >java whisky. Nikka らメソッドの説明が必要だ。メソッドは返 とします ( コンパイルと実行の指定の違い クラス Nikka はパッケージ whis に属しま り値や引数を使うからデータ型の説明が必 す。同じパッケージにまとめたいクラスは に注意 ) 。 ・・あれ ? 」。しようがないので , 要だ。 同じパッケージ宣言をします。 ーバッケー ジの階層化 部の概念は名前を出すだけで , 後で説明し これをコンパイルしクラスファイルを作 ます。このことを「前方参照」といい , C に ージは階層化できます。たとえば , ります。しかし , 実行しようと思って , ノヾッケ 58 C MAGAZINE 2 1 9
す " [D" というシグネチャを用いています。 の取得 , GetStaticCharF1eld ( ) 関数と setstat のフィールド b を読み書きする処理です。 Li icCharField ( ) 関数は char 型の static フィー st 1- ①のように b は ch 型の s ねⅱ c フィ シグネチャに関する詳細は JNI のドキュメ ール ルドの読み書きのための関数です。なお G ントに記されていますが , JDK の中の java ドです。 etStaticCharFieId ( ) 関数と SetStaticCharFieI p というツールを使えば , クラスの各フィ static フィールドの場合には , List2- ⑥の d ( ) 関数の第 2 引数には , obj ではなく , ク ールドに対応するシグネチャを簡単に知る ように , 名称に「 Sta ⅱ c 」が入った関数を用 ラス情報を表す cls を指定することにご注 ことができます。たとえば JNITest3 クラス います。 意ください。 の場合 , List1 のコンパイル後に GetStaticFieldID ( ) 関数はフィールド ID Javap -s JNITest3 List CD プレイヤー ( Java プログラム , CDPlayer java) というコマンドを実行すると , g. 2 のよう な出力が得られ , 各フィールドのシグネチ java. awt.*; ャがわかります。「 javap 」は Java バイトコー import java. awt.event. *ー import javax. swing. *ー ドの逆アセンプラで , 「 - s 」はフィールドの シグネチャを表示するスイッチです。 - 簡易 CD プレイヤー public class CDPlayer extends JFrame implements Runnable ( フィールド a の値を読み書きするのは List / / 再生ボタン、停止ボタン JButton btnPIay, btnStop, / / 前後のトラックへの移動ボタン btnPrev, btnNext ・ 2- ⑤の後半の 2 行です。 a は int 型なので , 読 / / 状態表示用のラベル JLabel 山 lStatus; 土 cu てて e 北記 k い 0 ぬ朝て ack 町 / / 再生中トラック番号総トラック数 み出しには GetIntField() 関数 , 書き込みに / / 再生中トラックの再生位置 currentMinutes, currentSeconds, 4 。新 e 町一は 4 酥 sec 。 nd 鶩气〃、。再生中トラッ、クの総時間数 ~ は SetIn 正 ield ( ) 関数を用います。ここでは , - ネイティブメソッドの宣言 読み出した a の値に 1 を加えて書き戻してい や曲 e 、 void 0 信 y ( ) ツ / / 停止 public native void st 叩 ( ます。各関数の第 2 引数には , JNITest3 オプ public native void prev( 〃ーっ前のトラックへ / / ーっ後のトラックへ public native void next( ジェクトを表す「 obj 」変数を渡します。 obj - , ーう態取得 ア曲は c native vo getstatus( ) はこのネイテイプメソッドが属するオプジ - D も L のロード static { ェクトを指すポインタで , ネイテイプメソ System.IoadLibrary("CDPIayerExt"); ッドの第 2 引数です ( List2- ① ) 。 メインルーチン p 面は 0 static void main(string[ ] args) ( static フィールドの読み書き new CDPIayer( 次の List 2- ⑥は , JNITest3 オプジェクト Fig. 2 「 javap -s JNlTest3 」の実行結果 CompiIed from JNITest3. java p-blic class I s ヒ」 .8j8 し { int a; static char b; do 厄 c[]; public native void s ( ja . a . poi 北 (Ljava/awt/Point; )v * / p-blic static 土 d ( ヨ . S i [ ( [Ljava/lang/string; )v * / public JNITest3( static { / / CD 円 ay インスタンスの作成 p 面は 0 CDPlayer() ( super("CD Player"); - コンポーネントの配置 getcontentpane( ) . setLayout(new GridLayout(2,1) 物 lStatus=new ( IbIStatus. setHorizontaIAlignment(SwingConstants. C風狐駅わ getContentPane( ) . add(IbIStatus); JpaneI p=new JPaneI( p. setLayout(new GridLayout(1,4) p. add(btnPrev=new JButton("<<Prev") p. add(btnPIay=new JButton( ゆね y ″ ) p. add(btnstop=new JButton( "Stop") p. add(btnNext=new JButton("Next>>") getcontentpane( ) . add(p); setS 土 ze ( 400 , 100 setvisib 厄 ( true ー再生ボタン押下イベント処理 btnPIay. addActionListener(new ActionListener( ) ( public void actionPerformed(ActionEvent e) { play(); / / 再生 / / タイトルバー文字列の設定 - 停止ボタン押下イベント処理 btnStop. addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent e) ( st0P( / / 停止 トラック変更 ( 前 ) ボタン押下イベント処理 btnprev. addActionListener(new Act 土 0 セ en ( ) { public void actionPerformed(ActionEvent e) ( prev( / / 前トラックに変更 128 C MAGAZINE 2 1 9
List ム バッケージ宣言のあるファイル package whisky ー class Nikka{ public static void main(string[ ] args) { system. out.println( "Nikka" 1 パッケージの命名規則 Java プログラムをほかのシステムに提供 する際 , 同名のパッケージやクラスがある と困ります。パッケージ名を全世界で一意 にするために「所属している組織のドメイ ン名を逆にしてパッケージ名にする」こと が推奨されています。 たとえば , 私は adan@zob.ne.jp というメ ールアドレスを持っていますが , この場合 クラスパスの下に jp/ne/zob/adan/ というディレクトリを作って Java プログラ ムを置くようなやり方です。さらに細分化 するときはこの下にパッケージを作ります。 ただ , ディレクトリがやたら深くなってし まうきらいはあります。 List 2 impo 「 t を使わないクラスの使用 / / i 叩 or セを使わない class Martini{ int make( ) { spirit.gin. Beefeater g = new spirit. gin. Beefeater( wine. vermouth. NoillyPrat v = new wine. vermouth. N0土 llyprat( リ return g. getValue( ) 十 v. getvalue( List 3 import を使うクラスの使用 / / 土叩。て t を使う import spirit. gin. Beefeater ー import wine. vermouth. NoillyPrat; class Martini( 土 n セ make( ) { Beefeater g = new Beefeater ( NOi llyprat v = new NOi llyPrat( return g. getvalue( ) 十 v. getvalue( 潺 と起動させることができます。 複数の場所を始点にしたいとき , ; ( セミ コロン ) で区切って記述します。たとえば s et CLASSPATH=c:YprogYjava;d:YtestYJava の ようにします。カレントディレクトリも含 めたいならディレクトリ名として . ( ドット ) を付け足します。 UN Ⅸ系 OS の場合 , 設定方法がシェルに よって異なります。 bash 系のシェルの場合 ィレクトリを始点にしていました。 JDKI. impo 宣言をすればパッケージ名を省略し 2 以降ではデフォルトでそうなります。 export CLASSPATH=/home/name/prog/java てクラスを使うことができます。 Iist3 の 3, csh, tcsh 系シェルの場合 しかし , Java プログラムをシステムとし 4 行目にあるのが import 宣言です。これが あると , ソースファイル内で Beefeater と て動かすことを考えると , カレントディレ setenv CLASSPATH /home/name/prog/java のようにします。複数指定するときは : ( コ クトリを始点にするのは問題があります。 書けば spirit. gin. Beefeater を意味すること ロン ) で区切って書きます。これはコンソ 環境変数 CLASSPATH を設定することによ になります。 ールから入力してもいいのですが , 常に使 って , パッケージの始点を決めておくこと あるパッケージ内のクラスを使う場合 , うなら初期設定ファイル (. cshrc, . profile ができます。 import wi ne. * ・ など ) の中で記述します。 dows の場合 , autoexec. bat ファイルで , という宣言もできます。こうすると wine Java プログラムを書く人は , プログラム パッケージにある任意のクラスを import し set CLASSPATH=c :*prog%java を置く専用のディレクトリを作り , クラス のように記述します。このとき c:}progyjav たのと同じことになります。多数のクラス パスを通しておくことをお勧めします。 a ディレクトリがパッケージの始点になり を使うときに便利です。ただし , 推奨され なおクラスパスは環境変数としてではな ているのは 1 個 1 個書く方法です。またサ ます。たとえば Nikka. class ファイルはフル く , java コマンドや javac コマンドのオプシ プパッケージにまで効力は及びません。 パスでは , ョンとして指定することも可能です。公式 c :%prog%java*whisky%Nikka. c lass ークラスパス にはこっちのほうが勧められています。 と置きます。こうしておくと , 任意のディ その始点となるディレ レクトリで , >java -c lasspath /home/name/pr パッケージには , クトリが必要です。先の記述はカレントデ og/ java whisky. Nikka >java whisky. Nikka 60 C MAGAZINE 2 側 1 9
Java programmingTips 配列の要素へのポインタ ( ここでは c ) の両 いて配列の値を変更したら , List2- ⑩のよ 配列の読み書き 方が必要です。そして Iist2 イののように , ま うに ReIeaseDoubleA1 ・ rayEIements ( ) 関数を 続く List2- ⑦ , ⑩は , JN 仕 es オプジェク ず GetFieIdID() 関数でフィールド ID を取得 呼び出して , 変更を反映しなければなりま トのフィールド c を読み書きする処理です。 した後に , GetObjectField() 関数で配列情 せん。 GetDoubleArrayEIements ( ) 関数の第 List 1 イ D のように c は d 。 uble 型の配列です。 報を取得し , 続いて GetDoubleAr ・ rayEleme 3 引数と , ReleaseDoubIeA1 ・ rayElements ( ) 配列を読み書きするには , List2- ②のよ nts ( ) 関数で配列要素を取得します。 関数の第 4 引数は , 配列のコピーを制御す うに配列情報を扱う変数にこでは a Ⅳ ) と , 配列要素へのポインタ ( ここでは c) を用 るためのパラメータですが , とりあえず 0 を指定しておいてかまいません。 List 3 オブジェクト引数の読み書き 最後の List2- ⑧ , ⑨は , List2- ①のように 引数として渡されたオプジェクト p を読み 書きする処理です。 List1-@のように , p は java. awt. Point オプジェクトです p のフィールドを読み書きする方法は , す でに説明した JNITest3 オプジェクトのフィ ールドを読み書きする方法とほば同じです。 List2- ⑧のようにクラス情報を取得し , List 2- ⑨のようにフィールド ID を取得します。 後は GetIntFieId ( ) 関数や SetIntFieId ( ) 関数 を用いて , フィールドにアクセスします。違 いは , 各関数の第 2 引数が。 bj ( JNITest3 オ プジェクト ) から p に変わっただけです。 ト拡張版 CD プレイヤー 前回 , JNI を生かしたプログラムの例と して , Windows の MCI を用いた簡単な CD プレイヤーを作りました。前回の CD プレ イヤーの機能は , 再生・停止と総トラック 数の表示だけでしたが , 今回はトラック変 更と再生状態表示を可能にしました。再生 状態の情報を C プログラム側から Java プロ グラム側に渡す際に , 今回解説した , C プ ログラムから Java オプジェクトのフィール ドに値を書き込む手法を用いています。 プログラムは Java プログラム ( List3 ) と C プログラム (List 4 ) です。コンパイルする には , 以下のコマンドを実行します。「 -w- 8057 」は Warn ⅲ g を抑制するスイッチです。 CDP layer. java コ avac javah -jni CDPI ayer 比 C32 - lc : 町 1.3 cl ⅵ c : 町 1. Java Programming Tips 129 トラック変更 ( 次 ) ボタン押下イベント処理 btnNext. addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent e) { / / 次トラックに変更 next( イ 0 - ウインドウを閉じたときのイベント処理 addWindowListener(new WindowAdapter( ) { public void windowCIosing(WindowEvent e) { / / アプリケーションの終了 System. exit( 0 - CD 状態表示用スレッドの起動 new Thread(this) . start( 一時間表示用に数値を 2 桁に整える string twoChars(int i) { string s = 0 ”十 return s. substring(s.length( ) -2 3 - CD 状態表示用スレッドの処理 public void run( ) { while (true) { - CD の状態を取得し、表示を更新 getStatus ( 物 lStatus. setText( Track # ″十 currentTrack 十 ″十 twoChars(currentMinutes) 十 十 twoChars ( currentseconds ) 十 ″ / ″十 twoChars(trackMinutes) 十 ”十 twoChars(trackSeconds) 十 - で Ot 引”十 totalTracks 十 track ( s 尸 定問隔で朝状態取得 7 表示更新を授り版す発あの時間待 try ( Thread. 引 eep ( 1000 / / 1 秒間隔で更新 } catch ( InterruptedException (e) イ break; Fig. 3 CD プレイヤーの実行画面 OD Player Track # 9 - ー 00 : 11 / 04 : 54 -- - T 12 track(s) op Next>> く P 「
ロロ 開発環境 レポート BorIand JBuiIder 5 for Mac OS X ボーランドが 1997 年に発表して以来 , 根強い人気を 誇る Java 用ビジュアル開発環境「 Bo 日 and JBuilder 」 がついに Mac OS X でも利用できるようになります。 本稿は評価用として配られた Preview Version を元 に , どのような開発環境であるかを紹介します。 真紀俊男 はじめに Borland JBuilder 5 ( 以下 JBuilder 5 ) はひ と言で言うと , Windows や Linux で人気の 高い Java 用ビジュアル開発環境です。 これだけではあんまりなので , もう少し説 明すると , ・ウイザードにより最初の叩き台が簡単 に作成可能 ・ RAD(Rapid Application Development) 環境なので , GUI 部品を載せたプログ ラミングが楽に行える ・デバッガが充実しているため , 効率的 な開発が可能 という特徴があります。 Java プログラム自体は特定のプラットホ ームに依存しないというたてまえがありま すが , 残念ながら Java の開発環境はどうや ら特定のプラットホームに偏っているよう です。従来の Mac OS には Java の開発環境 は筆者が知る限り 2 つしかなく , 1 つはす でに新規開発が中止され , もう 1 つは極端 に使い勝手が悪いため , 事情がわかってい る開発者はあえて Mac ではなく , Windows や Linux 上で別の Java 開発環境を利用して います。また , この間題とは別に Mac 上 には M 尉 [ 注 1 ] という Java 実行環境を実現す るミドルウェアが AppIe から配布されてい るのですが , これはいわゆる Java2 対応で はないため , JFC/Swing を利用したプログ ラムが開発できないという問題があります。 そのため JBuilder をはじめとした使い勝手 のいい Java 開発環境がなかなか Mac 上に現 れませんでした。 Mac OS X 以降 , OS の一階層として Java2 実行環境が埋め込まれ , 理論上は Pure Jav a で動作するプログラムならわざわざ移植 の手間をかけずにそのまま動作できるはず です。 ・・ということは Pure Java で作成し ているという JBuilder も Mac OS X で動作す るはずで , その登場が待たれていました。 ー [ 注 1]Mac OS Runtime for Java の略称 JBuiIder 5 for Mac OS X Preview Version 年に 1 回 , 主に Mac プログラム開発者に 向けて開催される WWDC[ 注幻という集いが あります。今年は Mac OSX への対応が最 重要項目となり , ほとんどの開発者にとっ ては劇的な変化をする API やフレームワー クにとまどいつつも , なんとか対応せねば という必死の思いがあったようです。 ところで Mac OS X は本誌 2001 年 6 月号の 特集 2 「 Mac OS X アプリケーション開発ガ いくつかの「切 イド」でも説明したように り口」が用意されており , そのうちの 1 つが Java です。つまり特定のプラットホームに 依存しない PureJava 向けの切り口が用意 されており , もしプログラムが Pure Java で 作成されているなら , そのまま Mac OS X で 動いてしまうわけです。ということは Pure Java で作成されている JBuilder なら , さほ ど手間をかけずにそのまま動くだろうとい う理屈です。事実 , ポーランドは , Mac O S X で動作する JBuilder の出荷を以前からア ナウンスしており , その約束を守っている ことを知らせる意味もあってか , WWDC で Preview Version の CD-ROM を配布しまし た。本稿は , その CD - ROM をインストール した Mac OSX 上で動作を確認しながら執 筆しました。 動作条件やどのような機能が用意されて いるかを TabIe 1 , 2 にまとめました。現在 のところ , 卩版的な扱いでいつ市販される のかについてはとくに発表されていません。 ポーランドの見通しとしては今年末になる 見込みだそうです。 なお , あくまで Preview ということであ TabIe 1 JBuilde 「 5 fo 「 Mac OS X p 「 eview Ve 「 sion の動作環境 OS CPU メモリ容量 ハードディスク容量 画面解像度 そのほか MacOSX G3 プロセッサ 350MHz またはそれ以上 最低 128M バイト ( 推奨 256M バイト ) 最低 150M バイト SVGA(800x600, 256 色 ) またはそれ以上 CD-ROM ドライブ , マウス , またはマウス以外のポインティング機器 最新開発環境レポート Borland JBuilder 5 fo 「 Mac OS X 1 3 /
click learn e-Learning 」 apan Anyone, Anytime, Anywhere 灯技術者のスキルアップを強力にサポート cIick21earn Japan の e-Learning 仼技術者にとって、日常の業務と同じくらい重要な自己のスキルアップ。 限られた時間内で最も効率的に、自己のレベルに合った学習を可能にする方法は何かー click21earn J 叩の←レ arning がこの問いへの答えを提供します ←レ arning は、インターネットを使った学習システム。いつでも、どこでも、インターネット に接続できる環境さえあれば、自分のペースで学習をすすめることができます。 click21earn Japan では、 サン・マイクロシステムズ「 SunTMWeb Learning Center(WLC) コースウェア」 ( オンラインコース ) をはじめ 「 JavaTM Tut 。ロースウェア」 ( 自習 CD - ROM 教栩など多くの ITå. 支術者を対象とした e - arning コースを提供 なかでも「 WLC コースウェア」は、長年にわたり高品質なセルフペース教育製品の開発、 販売をてがけ、世界中で確かな実績のあるサン・エデュケーション・サービスのノウハウを結集、 Ja 囲 TM テクノロジ、 So ね「 isTM システム管理、ネットワーク管理について効率的な学習を実現します。 ◆立〃 microsystems take it to the nth w し c コースウェ、 , ラインオップ ( On ⅱ ne ) UNIX 入門 (Solaris 7 ) 48 , OOO 円 SoIaris 7 システム管理ー 72,000 円 SoIaris 7 システム管理 ll 72,000 円 Java プログラミング (Java 2 ) 35 , 400 円 J aTuto ロースウェアラインナップ (CD-ROM) UNIX 入門 (Solaris 7 ) ライブラリ 96 , 000 円 SOIa 「 is 7 システム管理ーライブラリ 96 , 000 円 Solaris 7 システム管理 ll ライブラリ 96 , 000 円 Java プログラミング入門 (Java2) ライブラリ 96 , OOO 円 Java プログラミングライブラリ (Java2 対応 ) 96 , 000 円 ■問い合わせ先 クリック・トウー・ラーン TEL : 03-5772-0356 FAX : 03-5772-0357 e-mail: sales@click21earn. CO. JP URL:http://www.click21earn. CO. JP ・ Java 、 solans 、 JavaTutor は、米国およびその国における米国 Sun Mtcrosystems 社の商標または登録商標です。・ Unix は、 x / 0 n CompanyLim1ted がライセンスしている米国ならびにその他における登録商標です。 T 1 1 1 4 5 2 5 0 9 1 2 0 5 雑誌 14325-9 ◎ソフトバンクバブリッシング凸版印刷 PrintedinJapan
Java programmingTips a を読み書きする処理です。 List 1- ①のよ 情報とフィールド ID はそれぞれ jclass およ 手順 3 うに a は int 型の非 s ねⅱ c フィールドです。 び jfieIdID という型です。 続いて , C プログラム ( List2 ) をコンパイ a にアクセスするには , まず List 2- ④のよ List 2- ⑤の GetFieIdID() 関数の第 4 引数で ル・リンクして , DLL を作成します。 C コ うに GetObjectCIass() 関数を用いてクラス は " I " を渡していますが , これは int 型のフ ンパイラには , 本誌付録 CD - ROM に収録さ 情報を取得します。次に List2- ⑤のように ィールドを表す「シグネチャ」と呼ばれる文 GetFieldID() 関数を用いて , フィールド ID れている BorIand C + + CompiIer 5.5.1 を利用 字列です。次の List 2- ⑥では char 型を表す しました。以下のコマンドの「 c dkl. 3 」と を取得します。 List 2- ③のように "C" , 続く List 2- ⑦では double 型の配列を表 クラス いうパスは , JDKI. 3 をインストールしたデ Fig. 1 List 1 , 2 の出力結果 ィレクトリに合わせてください。正常にコ C:*work>java JNITest3 ンパイルとリンクが完了すると , JNITest Nat ive Ex d Ⅱというファイルが生成されます。 Java 比 C32 -lc:*jdkl. 3%include;c:*jdkI.3 *inc lude*win32 -WD JNITest3Ext. c これでコンパイルは終了です。以下の コマンドで実行します。 java JNITest3 なお JNITest3Ext. dll は , PATH 環境変数 で指定されたパス , またはカレントディレ クトリに置いておく必要があります。正し く動作すれば , F1g. 1 のようなメッセージが 出力されるはずです。上の行がネイテイプ プログラム (C プログラム ) の出力 , 下の行 が Java プログラムの出力です。 トプログラムの説明 List1, 2 の要点を解説します。まずは簡 単な List 1 から説明しましよう。 Java プログラム (List 1 ) List1- ②はネイテイプメソッド sub() の宣 言です。 sub() の内部では , List 10 で定義 される JN 仼 es オプジェクトのフィールド a, b, c と , List 1- ④で定義される java. awt. Point オプジェクト p にアクセスします。 List 10 のように , オプジェクト p は引数として sub ( ) メソッドに渡します。また , List 1 つ はネイテイプメソッドを含む DLL のロード 処理です。 フィールドの読み書き 次に I-ist2 について説明します。 List2-O, ⑤は , JNITest3 オプジェクトのフィールド List オプジェクト・配列の受け渡しの例 ( C プログラム , JNITest3Ext. c) #include く jn 土 . h 〉 #include "JNITest3. h" #include く stdio. h> - ネイティブメソッドの定義 I p ま vo 坦 - 工 CA い、 04V4 ー est3 ー s 面 ( I 新 v *envm 」 ob 00 ob 扣 ect pYC— / / Java の int 型に対応 jint / / Java の char 型に対応 jchar ノ / va の d 。厄型配列に対応 jdoubleArray 当ノみ 00 厄型配列の内容へのポインタ / / Poi れ t オブジェクトの各フィールドに対応 jint PX,PY; ・ / / va のクラズ情報 jclass clg; ノ / ava のクラスのフィールド IP jfieIdIP 、一 ー Java のクラス情報を取得 0 チⅵつ GetOb ゴ ec c s 引印ち ob ゴリ ー in セ型のフィールドを取得、変更 fid ま (*env)->GetFieIdID(env, els, % 滝 a (*env) → GetIntFieId(env, Obj ′ fid); 。 00 璉ト Se い職引引 env 0 わは坦計工 - char 型の static なフィールドを取得、変更 Eid = (*env) → GetStaticFieldID(env, cls, % % を b = (*env)->GetStaticCharField(env, cls, fid); (*env)»setscaticCharField(enVi の町 tid, b 十工 ) 引 - do 厄型配列のフィールドを取得 fid = (*env)->GetFieIdID(env, cls, nc", / / 配列情報を取得 ary = (*env)->GetObjectFieId(env, 0bj, fid); 。〃配列の内容を取得 0 (*env)—>GetDoubIeArrayElements(env, ary, 0 ) 引 - java. awt. point オブジェクトのフィールドを取得、変更 ~ なクラス情報を取得 0 (*env)-?GeCObjectCIass(envj や 土 d ま (*env)->GetFiéldID(env, 0 , *x / / p ⅸを取得、変更 px (*env)->GetIntField(env, p, fid); . ( * 00 ⅵつ Se した土引 d = ( env, p , = は , p = 十エ 0 = = = 。登、。 ; 0 0 、 = 0 { ゾ = = = = 0 冫 00 、 0 。 = fid = (*env) → GetFieldID(env, cls, y , py = (*env)->GetIntField(env, p, fid); (*env)->SetIntFieId(env, p, fid, py 十 1 - 取得した値の表示 printf ( "Native : a=%d, b='%c', c [ 0 ] = 宅 1. If , c [ 1 ] = 1. If , p = ( 宿宅 d n ” a, b, c[0], c[l), px, py - do 曲厄型配列のフィールドを変更 (*env)->ReIeaseDoubIeArrayEIements(env,aryt 0 , 0 〃内容の変更を反映 〃非 static の場合、 第 2 引数は。墫 / / static の場合、 / / ー第 2 引数は c 垣 ⑦⑧⑨ 〃 p. y を取得、変更 1 2 / Java Programming Tips
スタートアップ Ja a Java 言語事始 List ラスの abs ( ) メソッドは引数の型に応じて float や int などの値を返してきます。 文法的には別物と思っていいのですが , ただプログラム作法としては「意味的に」同 じ働きをするメソッドにしておかないとま ずいと思います。 ところで C + + には「引数のデフォルト値 の指定」という機能がありましたが , Java にはありません。 Java で同様の機能を実現 するにはオーバロード機能を使います (Lis オーバロードを使ってメソッドのデフォルト値を与える / / オーバーロードを使って引数のデフォルト値を与える class Data( / / ca ( 10 ′ 20 ) に同じ 土 n し calc()( return c 引 c ( 10 //calc(), 20 ) に同じ int calc(int x){ return calc(), 20 / / 最終的に呼び出されるメソッド int calc(int x, int y){ 4 t 4 ) 。 オーバライド List 5 可能 / 不可なオーバライドの例 〃可能なオーバーロードと不可なオーバーロード / / ユーザー定義例外の宣言 class AException extends Exception{) class AAException extends AException{) class BException extends Exception{) / / スーパークラス class Super{ / / オーバーライドされるメソッド void method( )throws AException{) / / 以下サブクラス c lass Sub1 extends Super { / / オーバーライドするメソッド / / 可 void method( )throws AException{) 名前もシグネチャも同じメソッドをサプ クラスで宣言し直すことがオーバライドで す ( 前回参照 ) 。オーバライドの場合 , 返却 値の型は同じでなければなりません。 ーオーバライドとアクセス可能性 オーバライドによってアクセス可能性を 変更することはできますが , 解放する方向 にのみ可能です。つまり , デフォルトアク セスは protected アクセスか public アクセス に , protected アクセスは public アクセスに のみできます。そうしないと , サプクラス でそのメソッドを使えなくなる事態が発生 してしまいます。 「親が約束したことは , 子供も尊重しなけ ればならない」と考えてください。親 ( スー パークラス ) が「このメソッドは public です よ。どうぞ使ってください」といったら , 子 供 ( サプクラス ) は使えるようにしなければ なりません。逆に親が「他人に使わせるの は惜しいから protected にする」といっても , 継承した子供が「みなさんに使ってもらお う」と思って public にするのは自由です。 「メソッド名」と「引数の数や型」をまとめ なお , private なメソッドは , そのクラス Java の場合 て , Java の用語ではシグネチャといいます。 オーバロードされた複数の 以外からのアクセス可能性が存在しないの メソッドは , 名前は同じだが別物と認識さ 名前が同じでシグネチャが異なるメソッド で , オーバライド自体が起こりません。ス を複数宣言することができ , これを ( メソ れます。それぞれの間にとくに関係はあり ーパークラスにある private メソッドと同じ ッド名の ) オーバロードといいます。 ません。多くの場合 , オーバロードしたと シグネチャのメソッドをサプクラスで宣言 きは返り値の型を同じにしますが , 必須で することはできますが , それはまったく別 はありません。たとえば java. lang. Math ク のものになります。 class Sub2 extends Super{ / / オーバーライドするメソッド / / 可 void method( )throws AAException{) class Sub3 extends Super{ / / オーバーライドするメソッド / / 不可 void method( )throws BException(} になります。スレッドについては何回か後 にまたお話します。 オーバロード 土北 cal c ( ) { . int c 引 c ( 土北 x){ . 土 n セ calc(long x){ . int calc(int x, int y){ . class Data( 63 スタートアップ Java
Products 日本アイ・ビー・エム ( 株 )/VisuaIAge for Java V4.0 を発売 日本アイ・ビー・エム ( 株 ) は同社の Ja Ⅳ回 AP 貶 .2 , JSPI . 1 に対応した。また , ら Bean を生成したり , Java ソースを Rat va 統合開発環境の最新版「 Visua ge fo 「 W e b S p h e 「 e のテスト環境を含み , ional Rose のモテルへ反映させることも Java V4.0 」を発売した。「 VisuaIAge for WebSphere 上でのアプレットのテスト ( 編集部 ) できる。 Java プロフェッショナル版 V4.0 」は 2001 やテパッグ &IDE から手軽に行える。リ 価格 年 9 月 28 日に 23 , 900 円 , 「 VisualAge for ポジトリを利用してプロジェクト / パッ VisualAge for Java プロフェッシ Java 工ンタープライズ版 V4.0 」は 2001 ケージ / クラス / メソッドといった単位で ョナル版 V4 ℃ 23 , 900 円 年 8 月 31 日に 428 , 900 円で出荷を開始す バージョン管理が行えるようになった。 VisualAge fO 「 Java 工ンタープラ る。いずれも Bo and JBuilder などから 工ンタープライズ版では EJB 用のウィ イス版 V4.0 428 , 900 円 のアップグレード割引が行われている。 ザードが付属し , さまざまなクラスやイ 動作環境 今回のバージョンアップでは , 同社の ンタフェイスを生成でき , XML parser f Windows 98 / 2000 / NT 4.0 (SP4) Web アプリケーションサーバ「 WebSph 0 「 Java, XML Gene 「 ato 「も標準搭載され , 問い合わせ先 e 「 e 」との連係を強化した部分が主な内容 OS / 390 , OS / 400 用のネイテイプコンパ 日本アイ・ビー・エム ( 株 ) で , J2EE と互換性がある WebSphere A イラや分散デバッガまで提供される。 Ra TEL : 0120-04-1992 pplication Server V4.0 をサポートし , Se tional Rose で作成した UML のクラス図か ◎ URL http://www.ibm.com/jp/software/ad/vajava/ Products ターボリナックスジャパン ( 株 )/Turbolinux 7 Workstation を発売 ターポリナックスジャパン ( 株 ) は同 機能が多く加えられている。 ックや学生や教育機関向けのアカデミッ 社の最新 OS 「 Tu 「 bo ⅱ nux 7 Workstation 」 日本語環境としては日本語変換ソフト クライセンスパックがある。 に「 ATOK X fo 「 Linux 」を搭載 , さらにリ を 9 月 7 日に発売すると発表した。 ( 編集部 ) 今回の機能強化により , 「クライアン コーの TrueType フォントを TL ゴシック ト OS 」としての機能がより際立つ形とな /TL 明朝 /TL 丸ゴシック M / TL 行書体灯 L 教 った。同製品は kerne 貶 .4.5 , glibc 2.2.3 , 科書体の 5 書体を標準で搭載した。 gcc 2.95.3 を採用し , USB 機器のサポー 開発環境には gcc をはじめ , Pe 月 5.6.1 , ト強化を行っている。また , テジタルカ Python 2.1 , Ruby 1.6.4 , php 4.0.5 を搭 メラのデータ取り込みや旧 E E 1394 サポ 載し , そのほかに各種ライブラリや IDE ツールも用意されている。 ートによるテジタルビデオのテータ取り 込み , P 引 mOS 内蔵の PDA と接続しデー インストーラは , 同社が開発している タバックアップやスケジュール管理など Mongoose の最新版により , USB 機器の を行う機能 , MP3, RealAudio などの再 自動検出やサウンド設定が行われる。 価格は 15 , 800 円のほか , ライセンスパ 生 / 編集ツールなど , コンシューマ向けの ◎ URL http://www.turbolinux.co.jp/ MONTHLY HEADLINE 145