Java調用C/C++實現的DLL動態庫——JNI


由於項目的需要,最近研究了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已經完成。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM