因工作的緣故,有機會接觸了java本地方法調用(JNI)。本文中記下了初試JNI的過程和一點點體會。
使用Java的JNI調用C/C++的動態聯結庫有個固定的步驟,下面將以一個最簡單的HelloWorld例子程序來說明調用過程。這個HelloWorld的例子只是簡單的顯示HelloWorld消息。
首先,我們創建一個名為jnitest的Eclipse工程,并新建一個src源代碼目錄。
這里我們編寫兩個Java類,一個命名為HelloWorld,一個命名為TestDLL。HelloWorld類包含一個本地方法displayHelloWorld(),TestDLL用于測試這個本地方法。HelloWorld的源碼清單如下:
List1. HelloWorld.java源碼
public class HelloWorld {
public native void displayHelloWorld();①
static{
System.loadLibrary("HelloWorld"); ②
}
}
TestDLL源碼如下:
List2. TestDLL.java源碼
public class TestDLL {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayHelloWorld();
}
}
說明:①是java本地方法申明;②裝入動態鏈接庫,"HelloWorld"是要裝入的動態鏈接庫名稱。
在Eclipse工具中編譯Java類。編譯后的class文件會自動放入工程目錄下的bin目錄中。
在windows中打開一個命令窗口,進入jnitest工程所在目錄下的bin目錄如:D:/workspace/jnitest/bin。鍵入javah -classpath D:/workspace/jnitest/bin HelloWorld命令生成頭文件HelloWorld.h。內容如下:
List3. HelloWorld.h源碼
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
注意,不要修改這個頭文件。
用VC6創建HelloWorld Win32動態鏈接庫工程。將上述生成的頭文件HelloWorld.h拷貝到
D:/PRogram Files/Microsoft Visual Studio/MyProjects/HelloWorld目錄下面。
將D:/j2sdk1.4.2/include目錄下的jni.h和D:/j2sdk1.4.2/include/win32/jni_md.h兩個頭文件拷貝到VC安裝目錄下的D:/Program Files/Microsoft Visual Studio/VC98/Include目錄下面。在VC IDE中新建HelloWorld.cpp文件,實現頭文件中聲明的方法并編譯生成DLL。
List4. HelloWorld.cpp源碼
#include "HelloWorld.h"
#include <stdio.h>
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("Hello World!/n");
return;
}
先將生成的DLL拷貝到jnitest工程的D:/workspace/jnitest/bin下面,然后設置DLL搜索路徑(環境變量PATH)為D:/workspace/jnitest/bin(JNI并沒有規定必須將dll放在與class文件相同的目錄,只要確保JVM能搜索到DLL即可)③。重新啟動Elipse后,運行測試程序,將看到控制臺輸出“Hello World!”
注意,③必須設置好DLL搜索路徑,或者將dll拷貝到C:/WINDOWS/system32下面。這里,我折騰了不少時間,才搞定。
(出處:http://www.survivalescaperooms.com)
新聞熱點
疑難解答
圖片精選