一種實現 Java調用C++的DLL的方法

來源:互聯網
上載者:User

http://topic.csdn.net/t/20020917/14/1030420.html

 

感謝大家支援,這幾天我在IBM中文及SUN官方網站中找了不少關於JNI的文章,受益非淺,希望  
   
  有相關問題的朋友,可到那找查相關資料.  
   
  1)在   Windows   中實現   Java   本地方法  
  http://www-900.ibm.com/developerWorks/cn/java/jnimthds/index.shtml  
  2)Java   Native   Interface:   Programmer's   Guide   and   Specification    
  http://java.sun.com/docs/books/jni  
   
  上面的文章對JNI介紹非常詳細,對JNI有性趣的朋友可以看看.  
   
  對於我提出的問題,我己有了成功例子,貼出來與大家分享.  
  有一myDll.dll庫,介面Trim(LPSTR   lpString),功能是把lpString中的空格去掉。檔案原碼  
   
  如下:  
  #include   <string.h>  
  #include   <windows.h>  
   
  #ifdef   _cplusplus  
  extern   "C"{  
  #endif  
  __declspec(dllexport)   void   Trim(LPSTR   lpString)  
  {  
  int   iLength   =   strlen(lpString);  
  int   iCount   =   0;  
  char   *lpChar   =   lpString;  
  int   i;  
  for(i=0;i<iLength;i++)  
  {  
  if(   *lpChar   !=   '   '   )  
  {  
  lpString[   iCount   ]   =   *lpChar;  
  iCount   ++;  
  }  
  lpChar   ++;  
  }  
  lpString[iCount   ++]   =   0;  
  }  
   
  #ifdef   _cplusplus  
  }  
  #endif  
   
  (用VC6的cl編譯該檔案產生動態連結程式庫,cl   -LD   myDll.c   -FemyDll.dll   )  
   
  這裡假設我們不能得到該動態連結程式庫的原代碼,只有DLL及LIB檔案,在通過JNI用java調用時  
   
  ,由於沒有DLL原代碼修改許可權,需要我們自己用C/C++再做一個中介庫DLL2,java調用這個  
   
  中介庫,該中介庫再調用原如的DLL庫,間接實現java本地方法的調用。  
  下面是我做的例子,環境:Win2000Server,JDK1.3,VC6.0  
   
  先編一個java程式,java2dll.java,代碼如下:  
  public   class   Java2dll  
  {  
   
   
   
   
  //聲明要用到的本地方法cTrim由中介庫(java2dll.dll)實現,它又調用了myDll.dll庫的T  
   
  rim(...)函數  
  private   native   String   cTrim(String   str);  
  static  
  {  
  System.loadLibrary(   "java2dll"   );     //載入本地方法(java2dll為動態  
   
  連結庫檔案名稱)  
  }  
   
  //自己定義的一個java方法,調用本地方法cTrim(),有點多餘,實際上你可直接訪  
   
  問本地方法cTrim()  
  public   String   javaTrim(String   str)  
  {  
  return   cTrim(str);  
  }  
   
  //示範結果  
  public   static   void   main(String[]   args)  
  {  
  Java2dll   ss   =   new   Java2dll();  
  String   str1="I   love   You.";  
  String   str2=ss.javaTrim(str1);  
  System.out.println("調用c   DLL前:");  
  System.out.println("str1="+str1);  
  System.out.println("調用c   DLL後:");  
  System.out.println("str2="+str2);  
  }  
  }  
   
  編譯該檔案,產生Java2dll.class檔案:    
  javac   Java2dll.java  
  產生C的標頭檔Java2dll.h:      
  javah   -jni   Java2dll  
   
  用C編寫中介庫java2dll.c  
  #include   <stdio.h>  
  #include   "java2dll.h"  
   
  JNIEXPORT   jstring   JNICALL   Java_Java2dll_cTrim  
    (JNIEnv   *env,   jobject   obj,   jstring   str)  
  {  
  const   char   *strTemp;  
  strTemp=(*env)->GetStringUTFChars(env,str,NULL);  
  //錯誤出現時  
  if(strTemp==NULL)  
  {  
  return   NULL;  
  }  
   
  //調用myDll.dll庫中的Trim()方法,去掉strTemp中的空格  
  Trim(strTemp);  
  return   (*env)->NewStringUTF(env,   strTemp);  
   
  (*env)->ReleaseStringUTFChars(env,str,strTemp);  
  }  
  說明:如果你用C++編寫,cpp檔案,上面代碼中的“(*env)”應改為“env”  
   
  編譯產生java2ddl.dll檔案。  
  用VC6的cl編譯。  
  cl   -Id:\jdk13\include   -Id:\jdk13\include\win32   -LD   java2dll.c   myDll.lib   -Fejava2dll.dll  
  說明:-Id:\jdk13\include指明JNI需要的標頭檔.h位置,D:\JDK13為我的JDK安裝目錄  
  -LD   表明要產生動態連結程式庫    
  myDll.lib或   -link    
   
  myDll.lib表明要把myDll.dll連結上,否則中介庫java2dll找不到Trim(..)方法。  
  您可用cl   /?得到HELP協助。  
   
  編譯成功後,可得到中介庫java2dll,運行一下,檢查結果。  
  java   Java2dll  
   
  好了,你自己試一下吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.