《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于Java程序調用VC++中的DLL的研究與應用
基于Java程序調用VC++中的DLL的研究與應用
來源:微型機與應用2014年第6期
孫文華, 劉 平
(南昌工程學院 信息工程學院,江西 南昌 330099)
摘要: 隨著計算機普及率的提升以及軟件行業的飛速發展,計算機語言也越來越受到廣大計算機愛好者和計算機軟件開發人員的關注。同時越來越多的服務要求跨平臺的實現。當前比較流行的兩大語言VC++和Java幾乎可以開發所有基于B/S架構和基于C/S架構的軟件項目。它們各有所長,如果能將Java和VC有效地結合起來,實現二者的互相調用,那將可以取長補短,同時可以避免許多重復的工作,提高編程的效率。
關鍵詞: 軟件 JAVA VC DLL MFC 漢字編碼
Abstract:
Key words :

摘   要: 隨著計算機普及率的提升以及軟件行業的飛速發展,計算機語言也越來越受到廣大計算機愛好者和計算機軟件開發人員的關注。同時越來越多的服務要求跨平臺的實現。當前比較流行的兩大語言VC++和Java幾乎可以開發所有基于B/S架構和基于C/S架構的軟件項目。它們各有所長,如果能將Java和VC有效地結合起來,實現二者的互相調用,那將可以取長補短,同時可以避免許多重復的工作,提高編程的效率。
關鍵詞: Java; VC; DLL; MFC; 漢字編碼

    雖然Java和VC++是當前兩大主流的編程語言,但是如果兩者之間不能有效結合,實現相互調用的話,勢必會給編程人員的工作帶來諸多不便,增加許多的重復工作,甚至有可能造成整個項目的擱淺。另外,不同語言之間的互相調用還可以有效地利用現有程序,并且不需要一遍一遍地撰寫類似的程序代碼。為此,本文引人了VC++中的動態鏈接庫文件,通過實例闡述了如何在Java中成功調用VC++動態鏈接庫的問題[1]。
1 技術介紹
1.1 動態鏈接庫DLL

    動態鏈接庫DLL好比一個封裝起來的“倉庫”,DLL是Dynamic Link Library的縮寫,其中封裝了一些或者部分可以被共享的例程和資源,采用動態的連接方式就能夠被其他程序動態裝載、運行以完成某些特定的功能。
    采用動態鏈接庫進行軟件開發,具體優勢主要有下面幾點:
 (1)對硬件資源方面的要求比較小
 在程序開發過程中,經常遇到多個程序調用同一個函數庫的情況,這時如果使用動態鏈接庫,就可以大大減少在磁盤和物理內存中重復代碼的加載。只有當生成的EXE 文件確實要調用該DLL模塊時,系統才會將其加載到內存空間中去。
 (2)項目體系結構模塊化開發
    程序結構模塊化對項目開發有著重要的作用,能夠方便項目的管理與功能的定制。動態鏈接庫的設計包含這種思想。另外,動態鏈接庫支持多語言。這樣可以有更廣闊的應用平臺,方便開發程序的移植,也可以在不同的開發平臺上調用。通常當開發的系統為龐大系統,避免不了有許多重復類型的功能,這時如果將這些類似的功能單獨做成DLL,將可以大大減少開發的工作量和提高開發的速度[2]。
    (3)軟件維護方便
    當動態鏈接庫中的函數需要更新或修復時,采用動態鏈接庫更方便。因為部署及安裝動態鏈接庫在此就不要求重新建立程序與該DLL 的連接。此外,如果多個程序使用同一個DLL,則多個程序都將從該更新或修復中獲益。當使用定期更新或修復的第三方DLL 時,此問題可能會更頻繁地出現,升級到DLL 就可以更容易解決這些問題。
 (4)功能實現的細節隱藏
    考慮到一些重要技術的保密和知識產權的保護,在某些情況下,通常將項目中一些功能實現的具體細節隱藏起來,即希望里面的部分代碼不被公開,這時動態鏈接庫就是一項非常不錯的實現方法。動態鏈接庫可以被其他應用程序訪問調用,但將代碼的具體細節完全隱藏起來。另外,DLL的語言無關性也是很重要的一個方面。正是由于動態鏈接庫DLL與語言無關的這個特點,故用VC++創建的DLL可以被其他任何支持動態鏈接庫的編程語言調用, 比如VB、Delphi、PD[3]等。
1.2 Java本地編程接口JNI
    JNI(Java Native Interfacejava)其實就是指Java本地程序接口,屬于JDK中的一部分。當Java程序中有需要調用通過VC++語言編寫的DLL時,此時最佳選擇就是使用JNI技術。通過使用Java本地接口書寫程序,可以確保代碼在不同的開發平臺上方便移植。JNI使得運行于Java虛擬機的代碼可以操作用C、C++或者匯編等書寫的應用程序或庫,同時也可以通過調用相應的接口函數將Java虛擬機內嵌到本地應用程序中。
    特別需要提醒的是,只要有下面幾種情況中的任何一種出現時,程序員就需要利用JNI來進行處理:(1)所開發的應用程序要使用到與平臺相關的屬性, 但Java標準類庫不支持對這些屬性的處理; (2)已經擁有了利用其他編程語言實現的應用程序或庫,希望用Java 直接調用這些應用程序或庫來實現; (3)程序中的某個模塊對運行的時間效率要求很高,此時希望用比較低級的語言(如匯編)來實現,同時希望在Java應用程序中使用這個模塊[4]。
2 設計與實現
2.1 設計步驟

    使用JNI在Java中調用VC++寫的DLL有以下幾個步驟:(1)創建Java類;(2)編譯Java代碼并生成頭文件;(3)開發DLL并實現方法;(4)編譯動態鏈接庫;(5)測試運行程序。
2.2 設計實例
2.2.1 無包情況

    (1)在Java中寫調用VC的代碼,具體如下:
    public class JieCheng{
        static{
        System.loadLibrary("JieCheng");
           //注意:不寫擴展名,名字要與DLL的文件名一致
     }
    public native static int jiecheng(int n); //聲明native方法
    public static void main(String args[]){
    int s;
    JieCheng jc=new JieCheng();
    s=jc.jiecheng(5);
    System.out.println(s);                            //聲明main法
    }
    }
    (2)在運行彈出的輸入框中輸入cmd進入dos界面,通過cd命令進入到安裝Java的路徑下面的bin中,假設安裝目錄是D:\Program Files\Java\jdk1.6.0_10\bin,把JieCheng.java文件移到D:\Program Files\Java\jdk1.6.0_10
\bin目錄下,輸入javac JieCheng.java,可以看到在該目錄下生成了JieCheng.class的文件。輸入javah JieCheng生成了JieCheng.h文件。具體如下:
    #include <jni.h>
    /* Header for class JieCheng */
    #ifndef _Included_JieCheng
    #define _Included_JieCheng
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     JieCheng
     * Method:    jiecheng
     * Signature: (I)I
    */
    JNIEXPORT jint JNICALL Java_JieCheng_jiecheng
          (JNIEnv *, jclass, jint);
    #ifdef __cplusplus
    }
    #endif
    #endif
    (3)在VC下創建DLL文件,名字一定要是System.loadLibrary("JieCheng")中的JieCheng,把JieCheng.h文件直接復制到該VC文件下,同時把jni.h,jni_md.h復制到VC工程下。在JieCheng.cpp文件下實現在Java中聲明過的方法,注意方法名一定要與JieCheng.h中聲明的方法一致,在方法中寫入代碼如下:
    #include"JieCheng.h"
    JNIEXPORT jint JNICALL Java_JieCheng_jiecheng(JNIEnv *,    jclass, jint n)
    {
    int i,s;
    s=1;
    for(i=1;i<=n;i++){
        s=s*i;}
    return s;
    }
    (4)在VC下編譯生成JieCheng.dll文件,把該文件直接復制到Java的安裝目錄下面的bin目錄下:D:\Program Files\Java\jdk1.6.0_10\bin。
    (5)把在VC下編譯生成的JieCheng.dll文件直接復制到Java的安裝目錄的bin目錄下:D:\Program Files\Java\jdk1.6.0_10\bin。運行命令:java JieCheng,本例中,JieCheng函數用于求一個數的階乘,所以在屏幕上顯示的結果是“120”。
2.2.2 有包情況

 


    有包的情況與上面介紹的無包情況大致相同。但需要特別強調、引起注意的地方是:首先需要在Java的安裝目錄bin下創建包名文件夾,假設創建的包名文件夾的名稱為NegerVector,然后把.java文件放在此文件夾中。接下來就是進入DOS環境下運行兩個命令,首先運行:javac NegerVector\ JieCheng.java;然后運行:javah  Neger Vector.JieCheng。其他的可以參照無包情況了,因為接下來與無包的情況基本相同。
    在許多大型項目的開發過程中,從提高開發效率以及實現代碼重用的角度來看,跨平臺服務的開發是未來的發展趨勢,從而經常需要在Java程序中調用VC中的DLL。本文從JNI技術出發,通過簡單的實例詳細闡述了JNI調用VC++寫的DLL的程序,解決了Java與VC的有效結合,實現了它們之間的相互調用。
參考文獻
[1] 王志文,夏秦,李平均.Java程序設計(修訂本)[M].西安:西安交通大學出版社,2005.
[2] 孫文華.一種基于Java編程的臟字過濾器的設計[J].微型機與應用,2012,31(9):18-19,23.
[3] 王敏,邵定宏,陸金桂.動態鏈接庫技術及其應用實[J].微計算機信息,2006,22(27):272-274.
[4] 宋曉字,王永會. Visual C++高級編程技術與實例[M].北京:中國水利水電出版社,2006.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 一本本久综合久久爱 | a级毛片毛片免费观看久潮喷 | 91社区视频| 欧美在线乱妇一级毛片 | 在线观看人成午夜影片 | 欧美成人性生活视频 | 中国一级毛片视频 | 亚洲欧美一区二区视频 | 女黄人东京手机福利视频 | 成人久久18免费网 | 国产日产高清欧美一区二区三区 | 亚洲haose在线观看 | 久久国产精品成人免费 | 亚欧美图片自偷自拍另类 | 欧美久草| 成年午夜| 欧美成在人线a免费 | 日韩精品中文字幕一区二区三区 | 国产精品日本欧美一区二区 | 久久久9999久久精品小说 | 国产一区二区三区四区在线观看 | 欧美日韩偷拍自拍 | 伊人国产在线视频 | 日本三级精品 | 一级一级一片免费高清 | 久久www免费人成_看片高清 | 国内精品久久久久久影院老狼 | 99久久亚洲综合精品网站 | 中文字幕成人免费高清在线 | 97se亚洲综合在线韩国专区福利 | 欧美大片毛片aaa免费看 | 久久99热精品免费观看欧美 | 国产成人高清精品免费软件 | 精品国产欧美精品v | 99精品国产在现线免费 | 亚洲国产精品成人午夜在线观看 | gay毛片| 美女a毛片 | 中文字幕视频在线 | 国产一精品一aⅴ一免费 | 亚洲图片 自拍偷拍 |