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。