native
日本語 | 固有 |
英語 | native |
ふりがな | ねいてぃぶ |
フリガナ | ネイティブ |
Java以外の機能を実行するための予約語。
Javaでは基本的にJ2SEに実装されている機能しか実行できない。J2SE以外の、たとえばOS固有の機能を実行できるようになると、そのプログラムはそのOSでしか実行できなくなるためである。Javaは基本的にOSに関係なく実行できる言語だが、それができなくなってしまうためである。
その、イレギュラーな「OS固有の機能」を実行するための予約語がnativeである。
nativeはメソッドに付け、abstractメソッドのように実装を付けないようにする。
コンパイル後、javahコマンドでクラスファイルを指定すると、nativeメソッドの宣言が記述されたC++言語のヘッダーファイルが生成される。
nativeメソッドの実装は、C++言語で記述する。関数の宣言はヘッダーファイルのものを使用する。
出力ファイルは、Windows系であればDLL、UNIX系であれば.soファイル形式で出力する。
これらをjavaコマンドから参照できる位置にコピーすることで関数を呼び出すことができる。
この機能を利用することで、Javaの限界を超える事ができる。
ただし、DLLや.soファイルも配布する必要がある、OSが変わると実行できない、といった問題点があり、あまり使用は勧められない。実際、たいがいのことはJavaで実現できる。
Javaでは基本的にJ2SEに実装されている機能しか実行できない。J2SE以外の、たとえばOS固有の機能を実行できるようになると、そのプログラムはそのOSでしか実行できなくなるためである。Javaは基本的にOSに関係なく実行できる言語だが、それができなくなってしまうためである。
その、イレギュラーな「OS固有の機能」を実行するための予約語がnativeである。
nativeはメソッドに付け、abstractメソッドのように実装を付けないようにする。
コンパイル後、javahコマンドでクラスファイルを指定すると、nativeメソッドの宣言が記述されたC++言語のヘッダーファイルが生成される。
nativeメソッドの実装は、C++言語で記述する。関数の宣言はヘッダーファイルのものを使用する。
出力ファイルは、Windows系であればDLL、UNIX系であれば.soファイル形式で出力する。
これらをjavaコマンドから参照できる位置にコピーすることで関数を呼び出すことができる。
この機能を利用することで、Javaの限界を超える事ができる。
ただし、DLLや.soファイルも配布する必要がある、OSが変わると実行できない、といった問題点があり、あまり使用は勧められない。実際、たいがいのことはJavaで実現できる。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// Sample.dllを読み込みます。
System.loadLibrary( "Sample" );
Sample sample = new Sample();
// DLLのviewOkDialog()関数を呼び出します。
sample.viewOkDialog();
}
/**
* nativeメソッド。
* このメソッドは、実際にはDLLにある関数です。
*/
public native void viewOkDialog();
}
// WindowsのDLLを呼び出す場合の手順。
1.上記のSample.javaをコンパイルしてください。
2.Sample.classファイルがあるディレクトリでjavah Sampleを実行してください。
Sample.hというヘッダーファイルが作られます。
3.Visual C++でWin32 Dynamic-Link Libraryプロジェクトを作ってください。
プロジェクト名は「Sample」にしてください。
4.プロジェクトのディレクトリにSample.hヘッダーファイルをコピーしてください。
5.Sample.cppソースファイルを作り、以下のコードを書いてください。
// Sample.cpp
#include "windows.h"
#include "Sample.h"
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
/*
Javaから呼び出す関数。
関数のシグネチャーはSample.hのものをそのまま持ってきています。
*/
JNIEXPORT void JNICALL Java_Sample_viewOkDialog(JNIEnv *, jobject)
{
MessageBox( NULL, "OK?", "テストダイアログ", MB_OK );
}
6.メニューの「プロジェクトの設定」-「C/C++」-「プリプロセッサ」の「インクルード ファイルのパス」に以下のパスを書いてください(ただし、J2SEのインストールディレクトリがC:\Java\j2sdk1.4.1_01の場合)。
C:\Java\j2sdk1.4.1_01\include,C:\Java\j2sdk1.4.1_01\include\win32
7.ビルドしてください。
8.できたSample.dllをSystem32ディレクトリにコピーしてください。
9.あとはJavaの方のSampleクラスを実行してください。これでダイアログが表示されるはずです。
public class Sample
{
public static void main( String[] args )
{
// Sample.dllを読み込みます。
System.loadLibrary( "Sample" );
Sample sample = new Sample();
// DLLのviewOkDialog()関数を呼び出します。
sample.viewOkDialog();
}
/**
* nativeメソッド。
* このメソッドは、実際にはDLLにある関数です。
*/
public native void viewOkDialog();
}
// WindowsのDLLを呼び出す場合の手順。
1.上記のSample.javaをコンパイルしてください。
2.Sample.classファイルがあるディレクトリでjavah Sampleを実行してください。
Sample.hというヘッダーファイルが作られます。
3.Visual C++でWin32 Dynamic-Link Libraryプロジェクトを作ってください。
プロジェクト名は「Sample」にしてください。
4.プロジェクトのディレクトリにSample.hヘッダーファイルをコピーしてください。
5.Sample.cppソースファイルを作り、以下のコードを書いてください。
// Sample.cpp
#include "windows.h"
#include "Sample.h"
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
/*
Javaから呼び出す関数。
関数のシグネチャーはSample.hのものをそのまま持ってきています。
*/
JNIEXPORT void JNICALL Java_Sample_viewOkDialog(JNIEnv *, jobject)
{
MessageBox( NULL, "OK?", "テストダイアログ", MB_OK );
}
6.メニューの「プロジェクトの設定」-「C/C++」-「プリプロセッサ」の「インクルード ファイルのパス」に以下のパスを書いてください(ただし、J2SEのインストールディレクトリがC:\Java\j2sdk1.4.1_01の場合)。
C:\Java\j2sdk1.4.1_01\include,C:\Java\j2sdk1.4.1_01\include\win32
7.ビルドしてください。
8.できたSample.dllをSystem32ディレクトリにコピーしてください。
9.あとはJavaの方のSampleクラスを実行してください。これでダイアログが表示されるはずです。
// Sample.java public class Sample { public static void main( String[] args ) { // Sample.dllを読み込みます。 System.loadLibrary( "Sample" ); Sample sample = new Sample(); // DLLのviewOkDialog()関数を呼び出します。 sample.viewOkDialog(); } /** * nativeメソッド。 * このメソッドは、実際にはDLLにある関数です。 */ public native void viewOkDialog(); } // WindowsのDLLを呼び出す場合の手順。 1.上記のSample.javaをコンパイルしてください。 2.Sample.classファイルがあるディレクトリでjavah Sampleを実行してください。 Sample.hというヘッダーファイルが作られます。 3.Visual C++でWin32 Dynamic-Link Libraryプロジェクトを作ってください。 プロジェクト名は「Sample」にしてください。 4.プロジェクトのディレクトリにSample.hヘッダーファイルをコピーしてください。 5.Sample.cppソースファイルを作り、以下のコードを書いてください。 // Sample.cpp #include "windows.h" #include "Sample.h" extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { return TRUE; } /* Javaから呼び出す関数。 関数のシグネチャーはSample.hのものをそのまま持ってきています。 */ JNIEXPORT void JNICALL Java_Sample_viewOkDialog(JNIEnv *, jobject) { MessageBox( NULL, "OK?", "テストダイアログ", MB_OK ); } 6.メニューの「プロジェクトの設定」-「C/C++」-「プリプロセッサ」の「インクルード ファイルのパス」に以下のパスを書いてください(ただし、J2SEのインストールディレクトリがC:\Java\j2sdk1.4.1_01の場合)。 C:\Java\j2sdk1.4.1_01\include,C:\Java\j2sdk1.4.1_01\include\win32 7.ビルドしてください。 8.できたSample.dllをSystem32ディレクトリにコピーしてください。 9.あとはJavaの方のSampleクラスを実行してください。これでダイアログが表示されるはずです。