Java中調用C/C++產生的DLL

來源:互聯網
上載者:User
Java中調用C/C++產生的DLL

一、 產生C的標頭檔

  1. 編輯Main.java
 
  1.  public class Main
  2.   {
  3.   public native static int getStrNum(byte str[], int strLen);
  4.   }

  2. 產生標頭檔
  按win + r開啟“運行”視窗,輸入“cmd”,開啟DOS控制台視窗。進入上面Main.java所在的目錄中,輸入:
  javac Main.java
  javah Main
  兩條命令完成後會產生Main.h檔案

  二、 產生DLL
  1. 建立空工程
  在VS中建立工程:Win32 Console Application,取名“MakeDLL”,選擇空工程。建立後修改工程屬性:
  (1) General中,將“Configuration Type”改為“Dynamic Library (.dll)”;
  (2) C/C++的General中,將“Additional Include Directories”添加兩項:
  “C:Program FilesJavajdk1.5.0_06include”
  “C:Program FilesJavajdk1.5.0_06includewin32”
  根據你安裝的JAVA路徑而設定,這是因為在C/C++編譯過程中要使用JAVA的jni.h等檔案
  2. 將上面產生的Main.h添加入工程
  3. 建立一個新的檔案main.cpp,代碼如下:

 

  1.  #include "Main.h"
  2.   #include <string.h>
  3.   JNIEXPORT jint JNICALL Java_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
  4.   {
  5.   jbyte *buffer = (*env).GetByteArrayElements(str, 0);
  6.   buffer[strLen] = ’’; // 由於JAVA自動分配空間,需要傳進來字串長度參數
  7.   jint len = strlen((char*)buffer);
  8.   return len;
  9.   }

  4. 按F7編譯連結,產生MakeDLL.dll檔案

  三、 JAVA調用DLL
  在JAVA中使用上面產生的DLL檔案:
  1. 將MakeDLL.dll複製到與使用DLL的JAVA檔案相同的目錄下。
  2. JAVA檔案的原始碼:
  

  1. public class Main
  2.   {
  3.   static
  4.   {
  5.   System.loadLibrary(’MakeDLL’);
  6.   }
  7.   public native static int getStrNum(byte str[], int strLen);
  8.   public static void main(String[] args)
  9.   {
  10.   Main instance = new Main();
  11.   String str = new String(’haha’);
  12.   int num = instance.getStrNum(str.getBytes(), str.length());
  13.   System.out.println(num);
  14.   }
  15.   }

  總結:
  另外,JAVA與DLL函數的參數傳遞過程,考試,大提示像int類型的,可以直接從JNI函數參數列表中擷取;而數組元素則要通過JNIEnv來擷取:
  jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是參數列表中jbyteArray變數
  同理可以擷取char[]的元素。
  函數返回時,可以直接用return語句返回。也可以設定參數列表中的變數指標來返回:
  (*env).SetByteArrayRegion(byteArray, 0, 128, byteArr);
  byteArray是參數列表中的jbyteArray變數,作為指標用來返回需要返回的資訊;byteArr是jbyte*類型,裡面存放的值是要返回的內容。 



圖1 C++與Java互調圖   
其它的資訊可以從Google或Baidu中通過尋找“jni”或“java調用DLL”來查閱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.