一、基本概念
Jni是Java Native Interface的英文縮寫,意思是JAVA本地接口。通俗點的意思就是用JAVA調用C或者C++。在實際開發過程中很可能會使用到C或者C++開發的DLL,這個時候就需要用JAVA來調用DLL。
二、實現一個簡單的Jni
1、編寫一個簡單的JAVA類(Test.java)
public class Test {
public native void firstTest();
public static void main(String[] args) {
}
}
這段代碼中,使用native關鍵字來修飾 firstTest()方法。這個firstTest方法就是將要在C或者C++中實現的方法。
2、獲得.h頭文件
首先確保環境變量配置正確。編譯Test.java類,我的項目目錄是:E:\Java#project\Jni。然后在CMD下執行以下命令:
命令運行成功后,會在E:\Java#project\Jni\bin目錄下生成com_test01_Test.h文件。
剛才使用javah命令是JDK自帶的命令,就是用來生成.h文件的。如果想查看javah,請打開JDK目錄:D:\Program Files\Java\jdk1.6.0_13\bin。
3、編寫C++.NET程序
這里說明下 哈,本人不太會C++,所以這里就只能寫C++.NET程序來測試下了。效果都是一樣的。
(1)打開VS2008,新建一個C++工程,如下圖:
(2)將com_test01_Test.h頭文件引入到項目中
將D:\Program Files\Java\jdk1.6.0_13\include下的jni.h文件 和 D:\Program Files\Java\jdk1.6.0_13\include\win32下的jni_md.h文件拷貝到項目根目錄下,打開將com_test01_Test.h,將最上面的#include <jni.h>修改為#include "jni.h"。然后在源文件的Jni01.cpp中 引入com_test01_Test.h 並編項目,如下圖所示:
(3)在C++.net程序中實現Jni方法
打開com_test01_Test.h文件,會看見如下代碼:
#include "jni.h" /* Header for class com_test01_Test */
#ifndef _Included_com_test01_Test
#define _Included_com_test01_Test
#ifdef __cplusplus
extern "C" {
JNIEXPORT void JNICALL Java_com_test01_Test_firstTest (JNIEnv *, jobject);
#ifdef __cplusplus }
#endif
#endif
其中JNIEXPORT void JNICALL Java_com_test01_Test_firstTest (JNIEnv *, jobject); 就是第一步Test.java類中firstTest()方法在C++.net程序中的體現,下面將Java_com_test01_Test_firstTest這個方法在Jni01.cpp中實現一下,然后編譯整個項目。Jni01.cpp的代碼如下:
#include "stdafx.h"
#include "WINSCARD.H"
#include "com_test01_Test.h" using namespace System;
int main(array<System::String ^> ^args) {
Console::WriteLine(L"Hello World");
return 0;
}
//實現Java_com_test01_Test_firstTest方法
JNIEXPORT void JNICALL Java_com_test01_Test_firstTest(JNIEnv *, jobject){
Console::WriteLine(L"第一個Jni小程序");
}
4、將Jni01.dll配置到環境變量中
上一步操作編譯完成后,打開項目文件,我的電腦上目錄是:E:\C#project\Jni\Debug,找到Jni01.dll文件,這個文件就是最后得到的dll。為了JAVA程序運行時能找到這個DLL,所以要在環境變量上配置一下,找到環境變量中的”path“,打開如下圖所示:
將C++.net程序的項目debug文件夾路徑E:\C#project\Jni\Debug 配置到環境變量。如圖:
5、在Java程序中測試一下。
在第一步操作中的Test.java類的main方法中寫如下測試代碼:
public static void main(String[] args) {
System.loadLibrary("Jni01");
new Test().firstTest();
}
其中System.loadLibrary方法就是用來加載DLL文件的,參數名就是DLL文件的名字(注:本列中DLL文件是Jni01.dll,這里的參數只填寫Jni01,沒有后綴名)。
運行Test.java,效果如下:
以上就是用Jni實現Java調用C++的一個簡單小程序,謝謝!