天天看點

Java調用C/C++實作的DLL動态庫——JNI

由于項目的需要,最近研究了java 調用DLL的方法,将如何調用的寫于此,便于日後查閱:

采用的方法是JNI:Java Native Interface,簡稱JNI,是Java平台的一部分,可用于讓Java和其他語言編寫的代碼進行互動。

下面是從網上摘取的JNI工作示意圖:

Java調用C/C++實作的DLL動态庫——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頭檔案,内容如下:

Java調用C/C++實作的DLL動态庫——JNI
Java調用C/C++實作的DLL動态庫——JNI

注意: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)

  var = DLL_API_SUB(a,b);

JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b)

  var = DLL_API_MUL(a,b);

JNIEXPORT jint JNICALL Java_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b)

  var = DLL_API_DIV(a,b);

}  //此檔案完

加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所在的目錄,如下:

Java調用C/C++實作的DLL動态庫——JNI

4、編譯動态庫工程:生成javaCallcpp.dll,并将這個動态庫複制到java工程目錄下:

Java調用C/C++實作的DLL動态庫——JNI

5、使用DLL:運作java程式,結果如下:

Java調用C/C++實作的DLL動态庫——JNI

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