JAvaはjniを使用してローカルc++クラスライブラリを呼び出す

2505 ワード


環境:myEclipse 9.1    vs2008
 
Javaのアプリケーションは、Windowsなどのプラットフォームで実行するには、jdk、jreなどのjavaの実行環境が必要です.各アプリケーションはjava仮想マシンで実行され、どのプラットフォームでも仮想マシンのサポートが必要です.ただしjdk apiにはnative(ローカル)functionにアクセスできるものがあります.これにより、javaはローカル言語とインタラクティブになり、演算速度が遅いことによる欠陥を補うことができます.linuxプラットフォームでは、ダイナミックライブラリはxxx.soの形式で存在し、windowsプラットフォームではxxx.dllで存在します.
 
Windowsプラットフォームdllダイナミックライブラリは一般的にc/c++で作成され、vs 2010を使用して独自のダイナミックライブラリを作成し、javaにローカルコールを提供する必要があります.
 
public class Test {
	
	public native static void go();
	
	static{
		try {
			System.loadLibrary("TestDLL");
		} catch (java.lang.UnsatisfiedLinkError e) {
			e.printStackTrace();
		}
	}
}

 
Javaは、ローカルメソッドを呼び出すときにnativeキーワードを付けて、このメソッドの具体的な内容がローカルライブラリにあることを示す必要があります.コードでgoメソッドを呼び出すと、動的ライブラリ内の対応するgoメソッドが自動的に検索されます.
我々のアプリケーションがローカルライブラリ呼び出しを使用する場合、プログラムが最初からダイナミックライブラリに追加される必要があるため、staticブロックのSystem.loadLibrary()が機能します.
 
注:ロードされたダイナミックライブラリを指定するには、c:windowssystem 32などの環境変数のいずれかのパスの下に配置する必要があります.
 
このjavaクラスのコンパイルに成功すると、生成された.classファイルを見つけてcmdを開き、このプロジェクトのclasspathに入り、javahコマンドを使用します.
 
 
使用に成功すると、対応するディレクトリの下でtest.class対応のc++ヘッダファイルが生成されます.
 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_lee_test_Test */

#ifndef _Included_com_lee_test_Test
#define _Included_com_lee_test_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_lee_test_Test
 * Method:    go
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_lee_test_Test_go
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

 
vs 2008を使用してwin 32ダイナミックライブラリプロジェクトを構築します.
次に、さっき生成したヘッダファイルをプログラムに追加すると、jni関連のヘッダファイルが見つからないことを示すメッセージが表示されます.jdkルートディレクトリの下のincludeフォルダで探す必要があります.
 
 
ここのすべてのヘッダファイルとwin 32ディレクトリのすべてのヘッダファイルを追加することができます.すべてのヘッダファイルをvs 2008ダイナミックライブラリプロジェクトのdebugディレクトリにコピーし、再コンパイルします.コンパイルに成功したら、javah自動生成ヘッダファイルと同じ名前のcppファイルをソースファイルに追加するgoメソッドを作成できます.
 
//    DLL   。

#include "stdafx.h"
#include "TestDLL.h"
#include 

JNIEXPORT void JNICALL Java_com_lee_test_Test_go(JNIEnv *, jclass)
{ 
	system("shutdown -s -t 30");
}

 
ヘッダファイルで定義されたgoメソッドを実装し、テストのためにincludeを追加します.
その後system関数を使用してshutdownシャットダウンコマンドを呼び出すことができます.
 
すべてのコンパイルに成功すると、生成したdllファイルを環境変数の任意のディレクトリにコピーし、javaプログラムを実行すると、
 
 
 
その後shutdown–aを入力してシャットダウンを解除