乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一種實(shí)現(xiàn) Java調(diào)用C 的DLL的方法

       南郡修道院 2012-02-15

      一種實(shí)現(xiàn) Java調(diào)用C++的DLL的方法

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

       

      感謝大家支持,這幾天我在IBM中文及SUN官方網(wǎng)站中找了不少關(guān)于JNI的文章,受益非淺,希望  
         
        有相關(guān)問(wèn)題的朋友,可到那找查相關(guān)資料.  
         
        1)在   Windows   中實(shí)現(xiàn)   Java   本地方法  
        http://www-900.ibm.com/developerWorks/cn/java/jnimthds/index.shtml  
        2)Java   Native   Interface:   Programmer's   Guide   and   Specification    
        http://java./docs/books/jni  
         
        上面的文章對(duì)JNI介紹非常詳細(xì),對(duì)JNI有性趣的朋友可以看看.  
         
        對(duì)于我提出的問(wèn)題,我己有了成功例子,貼出來(lái)與大家分享.  
        有一myDll.dll庫(kù),接口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編譯該文件生成動(dòng)態(tài)鏈接庫(kù),cl   -LD   myDll.c   -FemyDll.dll   )  
         
        這里假設(shè)我們不能得到該動(dòng)態(tài)鏈接庫(kù)的原代碼,只有DLL及LIB文件,在通過(guò)JNI用java調(diào)用時(shí)  
         
        ,由于沒(méi)有DLL原代碼修改權(quán)限,需要我們自己用C/C++再做一個(gè)中介庫(kù)DLL2,java調(diào)用這個(gè)  
         
        中介庫(kù),該中介庫(kù)再調(diào)用原如的DLL庫(kù),間接實(shí)現(xiàn)java本地方法的調(diào)用。  
        下面是我做的例子,環(huán)境:Win2000Server,JDK1.3,VC6.0  
         
        先編一個(gè)java程序,java2dll.java,代碼如下:  
        public   class   Java2dll  
        {  
         
         
         
         
        //聲明要用到的本地方法cTrim由中介庫(kù)(java2dll.dll)實(shí)現(xiàn),它又調(diào)用了myDll.dll庫(kù)的T  
         
        rim(...)函數(shù)  
        private   native   String   cTrim(String   str);  
        static  
        {  
        System.loadLibrary(   "java2dll"   );     //加載本地方法(java2dll為動(dòng)態(tài)  
         
        鏈接庫(kù)文件名)  
        }  
         
        //自己定義的一個(gè)java方法,調(diào)用本地方法cTrim(),有點(diǎn)多余,實(shí)際上你可直接訪  
         
        問(wèn)本地方法cTrim()  
        public   String   javaTrim(String   str)  
        {  
        return   cTrim(str);  
        }  
         
        //演示結(jié)果  
        public   static   void   main(String[]   args)  
        {  
        Java2dll   ss   =   new   Java2dll();  
        String   str1="I   love   You.";  
        String   str2=ss.javaTrim(str1);  
        System.out.println("調(diào)用c   DLL前:");  
        System.out.println("str1="+str1);  
        System.out.println("調(diào)用c   DLL后:");  
        System.out.println("str2="+str2);  
        }  
        }  
         
        編譯該文件,生成Java2dll.class文件:    
        javac   Java2dll.java  
        生成C的頭文件Java2dll.h:      
        javah   -jni   Java2dll  
         
        用C編寫(xiě)中介庫(kù)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);  
        //錯(cuò)誤出現(xiàn)時(shí)  
        if(strTemp==NULL)  
        {  
        return   NULL;  
        }  
         
        //調(diào)用myDll.dll庫(kù)中的Trim()方法,去掉strTemp中的空格  
        Trim(strTemp);  
        return   (*env)->NewStringUTF(env,   strTemp);  
         
        (*env)->ReleaseStringUTFChars(env,str,strTemp);  
        }  
        說(shuō)明:如果你用C++編寫(xiě),cpp文件,上面代碼中的“(*env)”應(yīng)改為“env”  
         
        編譯生成java2ddl.dll文件。  
        用VC6的cl編譯。  
        cl   -Id:\jdk13\include   -Id:\jdk13\include\win32   -LD   java2dll.c   myDll.lib   -Fejava2dll.dll  
        說(shuō)明:-Id:\jdk13\include指明JNI需要的頭文件.h位置,D:\JDK13為我的JDK安裝目錄  
        -LD   表明要生成動(dòng)態(tài)鏈接庫(kù)    
        myDll.lib或   -link    
         
        myDll.lib表明要把myDll.dll鏈接上,否則中介庫(kù)java2dll找不到Trim(..)方法。  
        您可用cl   /?得到HELP幫助。  
         
        編譯成功后,可得到中介庫(kù)java2dll,運(yùn)行一下,檢查結(jié)果。  
        java   Java2dll  
         
        好了,你自己試一下吧。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多