1. 程式人生 > >JNI介紹及簡單例項

JNI介紹及簡單例項

JNI概念

JNI是Java Native Interface的縮寫,中文為JAVA本地呼叫。

使用JNI, 可以呼叫用其他語言寫成的庫或程式, 尤其是C和C++。

好了,概念性的內容就不多介紹了, 直接進入例項

 JNI例項

例項環境: Eclispe3.7 + jdk1.6 + Visual Studio 2005

基本步驟:

1. 寫Java的測試類(在eclipse中)

2. 使用javah 命令,生成C標頭檔案(命令列方式)

3. 新建C++ 的Win32專案, 匯入以上生成的標頭檔案, 完善.cpp(Visual Studio 2005中)

4. 編譯生成動態連結庫(.dll)檔案

5. 將dll 檔案拷入"java.library.path" 對應的目錄中

6. 執行步驟1的java類((在eclipse中) 就能看到效果了。

完成此例子, 不一定需要安裝Eclipse和VS, 只不過藉助這些工具會比較方便一些。

詳細步驟:

1.  寫Java的測試類

public class JniTest {
	static{
		System.loadLibrary("jnitest");
	}
	public native void hello();
	
	public static void main(String args[]){
		new JniTest().hello();
	}
}

可以有包名, 只不過在javah 的時候就需要加上對應的包名。

2. 使用javah 命令,生成C標頭檔案(命令列方式)

在Eclipse 下會自動生成  JniTest.class 檔案(如果沒有生成,可以使用javac 命令生成)

進入.class 檔案產生的目錄, 執行

javah JniTest
會在此目錄下產生  JniTest.h 的標頭檔案。

3. 在VS 2005中

檔案 -> 新建.  專案名稱輸入 jnitest

選擇Visual C++ 語言--> Win32 專案

在下一步後選擇  DLL 和 空專案

新增類 JniTest; 會產生 JniTest.h 和JniTest.cpp兩個模板檔案

使用步驟2產生的標頭檔案替換JniTest.h; 內容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniTest */

#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniTest
 * Method:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JniTest_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

完善JniTest.cpp ; 內容如下
#include <stdio.h>
#include <stdlib.h>
#include "JniTest.h"

JNIEXPORT void JNICALL Java_JniTest_hello(JNIEnv * a, jobject b){
	printf("HelloWorld,This is a JNI Test");
}

4.編譯生成動態連結庫(.dll)檔案

要編譯生成  .dll ; 需要使用Java的一些標頭檔案;比如 jni.h;

工具 --> 選項

左邊選項中選   專案和解決方案--> VC++ 目錄 點選後新增

\jdk路徑\include\win32

\jdk路徑\include

這兩個路徑

點選  生成--> 生成解決方案

在debug 目錄下就能看見生成的  jnitest.dll 檔案了

特別注意: 此 dll 的生成路徑可能是外層的debug 目錄下

在內層的debug 路徑看到的是jnitest.dll.embed.manifest 等檔案

5. 將dll 檔案拷入"java.library.path" 對應的目錄中

可以通過

System.out.println(System.getProperty("java.library.path")); 看可以有哪些目錄

一般來說,可以把dll 拷入 WINDOWS\system32 下 或是 \jdk路徑\bin 目錄下。

6. 執行步驟1的java類((在eclipse中) 就能到在cpp檔案裡列印的日誌效果了~~

目前java與dll互動的技術主要有3種:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java與系統中的原生方法互動的技術(在windows\linux系統中,實現java與native method互調)。目前只能由c/c++實現。後兩個都是sourceforge上的開源專案,同時也都是基於jni技術的windows系統上的一個應用庫。Jacob(Java-Com Bridge)提供了java程式呼叫microsoft的com物件中的方法的能力。而除了com物件外,jawin(Java/Win32 integration project)還可以win32-dll動態連結庫中的方法。就功能而言:jni >> jawin>jacob,其大致的結構如下圖:

jni技術體系功能結構圖

就易用性而言,正好相反:jacob>jawin>>jni。