由於項目的需要,最近研究了java 調用DLL的方法,將如何調用的寫於此,便於日后查閱:
采用的方法是JNI:Java Native Interface,簡稱JNI,是Java平台的一部分,可用於讓Java和其他語言編寫的代碼進行交互。
下面是從網上摘取的JNI工作示意圖:

總體說明:先在JAVA中建立一個類,通過javac生成.class,再由javah生成.h;然后將.h復制到VC下,由VC實現具體函,
並編譯通過后生成DLL,將DLL放入JAVA工程中使用,完畢。
下面說說具體步驟(含實例):
1、建java類:裝載DLL,聲明要使用DLL方法,具體實現由DLL負責;代碼如下:
public class Java2cpp
{
static
{
System.loadLibrary("javaCallcpp");
}
public native int DLL_ADD(int a,int b); //加
public native int DLL_SUB(int a,int b); //減
public native int DLL_MUL(int a,int b); //乘
public native int DLL_DIV(int a,int b); //除
public static void main(String args[])
{
int sum = 0;
Java2cpp test = new Java2cpp();
sum = test.DLL_ADD(2, 4);
System.out.println("Java call cpp dll result:" + sum);
}
}
2、生成.h文件:cmd 到Java2cpp.java目錄下,做如下操作:
第一步:javac Java2cpp.java 生成java2cpp.class
第二步:javah Java2cpp 生成Java2cpp.h頭文件,內容如下:


注意:Java2cpp.h這個頭文件的內容是不能修改的,否則會出錯。
3、制做VC動態庫:創建一個C/C++動態庫工程,命名為javaCallcpp,導入java2cpp.h並實現其方法:
#include "Java2cpp.h"
#include "dllApi.h"
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b)
{
int var = 0;
var = DLL_API_ADD(a,b);
return var;
}
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b)
{
int var = 0;
var = DLL_API_SUB(a,b);
return var;
}
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b)
{
int var = 0;
var = DLL_API_MUL(a,b);
return var;
}
JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b)
{
int var = 0;
var = DLL_API_DIV(a,b);
return var;
} //此文件完
加DLL_API_ADD()、減DLL_API_SUB()、乘DLL_API_MUL()、除DLL_API_DIV()四個函數在別一個
文件中實現,文件名是dllApi.cpp,實現如下:
int DLL_API_ADD(int a,int b)
{
return (a+b);
}
int DLL_API_SUB(int a,int b)
{
return (a-b);
}
int DLL_API_MUL(int a,int b)
{
return (a*b);
}
int DLL_API_DIV(int a,int b)
{
return (a/b);
} //此文件完
此時工程還編譯不過,因為include<jni.h>出錯,需添加JNI所在的目錄,如下:

4、編譯動態庫工程:生成javaCallcpp.dll,並將這個動態庫復制到java工程目錄下:

5、使用DLL:運行java程序,結果如下:

至此,java調用dll已經完成。
