锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩国产天堂,欧美日韩一区二区三,亚洲一卡二卡三卡四卡五卡http://www.shnenglu.com/justin-shi/category/7794.html鍔姏鍋氫竴涓悎鏍肩殑鐢蜂漢銆傘傘?/description>zh-cnFri, 08 Aug 2008 05:23:21 GMTFri, 08 Aug 2008 05:23:21 GMT60鍦?Windows 涓疄鐜?Java 鏈湴鏂規硶http://www.shnenglu.com/justin-shi/archive/2008/08/08/58298.html騫藉菇騫藉菇Thu, 07 Aug 2008 21:17:00 GMThttp://www.shnenglu.com/justin-shi/archive/2008/08/08/58298.htmlhttp://www.shnenglu.com/justin-shi/comments/58298.htmlhttp://www.shnenglu.com/justin-shi/archive/2008/08/08/58298.html#Feedback0http://www.shnenglu.com/justin-shi/comments/commentRss/58298.htmlhttp://www.shnenglu.com/justin-shi/services/trackbacks/58298.html

鍦?Windows 涓疄鐜?Java 鏈湴鏂規硶

developerWorks
鏂囨。閫夐」
灝嗘欏典綔涓虹數瀛愰偖浠跺彂閫?src="http://www.ibm.com/i/v14/icons/em.gif"

灝嗘欏典綔涓虹數瀛愰偖浠跺彂閫?/font>


綰у埆錛?鍒濈駭

David WendtWebSphere Development Research Triangle Park, NC

1999 騫?5 鏈?01 鏃?/p>

鏈枃涓哄湪 32 浣?Windows 騫沖彴涓婂疄鐜?Java 鏈湴鏂規硶鎻愪緵浜嗗疄鐢ㄧ殑紺轟緥銆佹楠ゅ拰鍑嗗垯銆傝繖浜涚ず渚嬪寘鎷紶閫掑拰榪斿洖甯哥敤鐨勬暟鎹被鍨嬨?

鏈枃涓殑紺轟緥浣跨敤 Sun Microsystems 鍏徃鍒涘緩鐨?Java DevelopmentKit (JDK) 鐗堟湰 1.1.6 鍜?Java鏈湴鎺ュ彛 (JNI) 瑙勮寖銆?鐢?C 璇█緙栧啓鐨勬湰鍦頒唬鐮佹槸鐢?MicrosoftVisual C++ 緙栬瘧鍣ㄧ紪璇戠敓鎴愮殑銆?

綆浠?/span>

鏈枃鎻愪緵璋冪敤鏈湴 C 浠g爜鐨?Java 浠g爜紺轟緥錛屽寘鎷紶閫掑拰榪斿洖鏌愪簺甯哥敤鐨勬暟鎹被鍨嬨傛湰鍦版柟娉曞寘鍚湪鐗瑰畾浜庡鉤鍙扮殑鍙墽琛屾枃浠朵腑銆傚氨鏈枃涓殑紺轟緥鑰岃█錛屾湰鍦版柟娉曞寘鍚湪 Windows 32 浣嶅姩鎬侀摼鎺ュ簱 (DLL) 涓?/p>

涓嶈繃鎴戣鎻愰啋鎮紝瀵?Java 澶栭儴鐨勮皟鐢ㄩ氬父涓嶈兘縐繪鍒板叾浠栧鉤鍙頒笂錛屽湪 applet 涓繕鍙兘寮曞彂瀹夊叏寮傚父銆傚疄鐜版湰鍦頒唬鐮佸皢浣挎偍鐨?Java 搴旂敤紼嬪簭鏃犳硶閫氳繃 100% 綰?Java 嫻嬭瘯銆備絾鏄紝濡傛灉蹇呴』鎵ц鏈湴璋冪敤錛屽垯瑕佽冭檻鍑犱釜鍑嗗垯錛?/p>

  1. 灝嗘偍鐨勬墍鏈夋湰鍦版柟娉曢兘灝佽鍦ㄥ崟涓被涓紝榪欎釜綾昏皟鐢ㄥ崟涓?DLL銆傚浜庢瘡縐嶇洰鏍囨搷浣滅郴緇燂紝閮藉彲浠ョ敤鐗瑰畾浜庨傚綋騫沖彴鐨勭増鏈浛鎹㈣繖涓?DLL銆傝繖鏍峰氨鍙互灝嗘湰鍦頒唬鐮佺殑褰卞搷鍑忚嚦鏈灝忥紝騫舵湁鍔╀簬灝嗕互鍚庢墍闇鐨勭Щ妞嶉棶棰樺寘鍚湪鍐呫?
  2. 鏈湴鏂規硶瑕佺畝鍗曘傚敖閲忓皢鎮ㄧ殑 DLL 瀵逛換浣曠涓夋柟錛堝寘鎷?Microsoft錛夎繍琛屾椂 DLL 鐨勪緷璧栧噺鍒版渶灝忋備嬌鎮ㄧ殑鏈湴鏂規硶灝介噺鐙珛錛屼互灝嗗姞杞芥偍鐨?DLL 鍜屽簲鐢ㄧ▼搴忔墍闇鐨勫紑閿鍑忓埌鏈灝忋傚鏋滈渶瑕佽繍琛屾椂 DLL錛屽繀欏婚殢搴旂敤紼嬪簭涓璧鋒彁渚涘畠浠?




鍥為〉棣?/font>


Java 璋冪敤 C

瀵逛簬璋冪敤 C 鍑芥暟鐨?Java 鏂規硶錛屽繀欏誨湪 Java 綾諱腑澹版槑涓涓湰鍦版柟娉曘傚湪鏈儴鍒嗙殑鎵鏈夌ず渚嬩腑錛屾垜浠皢鍒涘緩涓涓悕涓?MyNative 鐨勭被錛屽茍閫愭鍦ㄥ叾涓姞鍏ユ柊鐨勫姛鑳姐傝繖寮鴻皟浜嗕竴縐嶆濇兂錛屽嵆灝嗘湰鍦版柟娉曢泦涓湪鍗曚釜綾諱腑錛屼互渚垮皢浠ュ悗鎵闇鐨勭Щ妞嶅伐浣滃噺鍒版渶灝戙?/p>



鍥為〉棣?/font>


紺轟緥 1 -- 浼犻掑弬鏁?/span>

鍦ㄧ涓涓ず渚嬩腑錛屾垜浠皢涓変釜甯哥敤鍙傛暟綾誨瀷浼犻掔粰鏈湴鍑芥暟錛?String銆?int鍜?boolean 銆傛湰渚嬭鏄庡湪鏈湴 C 浠g爜涓浣曞紩鐢ㄨ繖浜涘弬鏁般?

                        public class MyNative
                        {
                        public void showParms( String s, int i, boolean b )
                        {
                        showParms0( s, i , b );
                        }
                        private native void showParms0( String s, int i, boolean b );
                        static
                        {
                        System.loadLibrary( "MyNative" );
                        }
                        }
                        

璇鋒敞鎰忥紝鏈湴鏂規硶琚0鏄庝負涓撶敤鐨勶紝騫跺垱寤轟簡涓涓寘瑁呮柟娉曠敤浜庡叕鐢ㄧ洰鐨勩傝繖榪涗竴姝ュ皢鏈湴鏂規硶鍚屼唬鐮佺殑鍏朵綑閮ㄥ垎闅旂寮鏉ワ紝浠庤屽厑璁擱拡瀵規墍闇鐨勫鉤鍙板瀹冭繘琛屼紭鍖栥?static瀛愬彞鍔犺澆鍖呭惈鏈湴鏂規硶瀹炵幇鐨?DLL銆?

涓嬩竴姝ユ槸鐢熸垚 C 浠g爜鏉ュ疄鐜?showParms0 鏂規硶銆傛鏂規硶鐨?C 鍑芥暟鍘熷瀷鏄氳繃瀵?.class 鏂囦歡浣跨敤 javah 瀹炵敤紼嬪簭鏉ュ垱寤虹殑錛岃?.class 鏂囦歡鏄氳繃緙栬瘧 MyNative.java 鏂囦歡鐢熸垚鐨勩傝繖涓疄鐢ㄧ▼搴忓彲鍦?JDK 涓壘鍒般備笅闈㈡槸 javah 鐨勭敤娉曪細

                     javac MyNative.java錛堝皢 .java 緙栬瘧涓?.class錛?
                        javah -jni -classpath . (鎸囧畾婧愪唬鐮佺殑褰撳墠鐩綍錛岃繖閲岃娉ㄦ剰錛屾槸鎸噋ackage鐩綍鎵鍦ㄧ殑鐩綍)
                        MyNative錛堢敓鎴?.h 鏂囦歡錛?
                        

榪欏皢鐢熸垚涓涓?MyNative.h 鏂囦歡錛屽叾涓寘鍚竴涓湰鍦版柟娉曞師鍨嬶紝濡備笅鎵紺猴細

                       /*
                        * Class:     MyNative
                        * Method:    showParms0
                        * Signature: (Ljava/lang/String;IZ)V
                        */
                        JNIEXPORT void JNICALL Java_MyNative_showParms0
                        (JNIEnv *, jobject, jstring, jint, jboolean);
                        

絎竴涓弬鏁版槸璋冪敤 JNI 鏂規硶鏃朵嬌鐢ㄧ殑 JNI Environment 鎸囬拡銆傜浜屼釜鍙傛暟鏄寚鍚戝湪姝?Java 浠g爜涓疄渚嬪寲鐨?Java 瀵硅薄 MyNative 鐨勪竴涓彞鏌勩傚叾浠栧弬鏁版槸鏂規硶鏈韓鐨勫弬鏁般傝娉ㄦ剰錛孧yNative.h 鍖呮嫭澶存枃浠?jni.h銆俲ni.h 鍖呭惈 JNI API 鍜屽彉閲忕被鍨嬶紙鍖呮嫭jobject銆乯string銆乯int銆乯boolean錛岀瓑絳夛級鐨勫師鍨嬪拰鍏朵粬澹版槑銆?/p>

鏈湴鏂規硶鏄湪鏂囦歡 MyNative.c 涓敤 C 璇█瀹炵幇鐨勶細

                        #include <stdio.h>
                        #include "MyNative.h"
                        JNIEXPORT void JNICALL Java_MyNative_showParms0
                        (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b)
                        {
                        const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );
                        printf( "String = [%s]\n", szStr );
                        printf( "int = %d\n", i );
                        printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );
                        (*env)->ReleaseStringUTFChars( env, s, szStr );
                        }
                        

JNI API錛孏etStringUTFChars錛岀敤鏉ユ牴鎹?Java 瀛楃涓叉垨 jstring 鍙傛暟鍒涘緩 C 瀛楃涓層傝繖鏄繀闇鐨勶紝鍥犱負鍦ㄦ湰鍦頒唬鐮佷腑涓嶈兘鐩存帴璇誨彇 Java 瀛楃涓詫紝鑰屽繀欏誨皢鍏惰漿鎹負 C 瀛楃涓叉垨 Unicode銆傛湁鍏寵漿鎹?Java 瀛楃涓茬殑璇︾粏淇℃伅錛岃鍙傞槄鏍囬涓?NLS Strings and JNI 鐨勪竴綃囪鏂囥備絾鏄紝jboolean 鍜?jint 鍊煎彲浠ョ洿鎺ヤ嬌鐢ㄣ?/p>

MyNative.dll 鏄氳繃緙栬瘧 C 婧愭枃浠跺垱寤虹殑銆備笅闈㈢殑緙栬瘧璇彞浣跨敤 Microsoft Visual C++ 緙栬瘧鍣細

                           cl -Ic:\jdk1.1.6\include -Ic:\jdk1.1.6\include\win32 -LD MyNative.c
                        -FeMyNative.dll
                        

鍏朵腑 c:\jdk1.1.6 鏄?JDK 鐨勫畨瑁呰礬寰勩?/p>

MyNative.dll 宸插垱寤哄ソ錛岀幇鍦ㄥ氨鍙皢鍏剁敤浜?MyNative 綾諱簡銆?
鍙互榪欐牱嫻嬭瘯榪欎釜鏈湴鏂規硶錛氬湪 MyNative 綾諱腑鍒涘緩涓涓?main 鏂規硶鏉ヨ皟鐢?showParms 鏂規硶錛屽涓嬫墍紺猴細

                            public static void main( String[] args )
                        {
                        MyNative obj = new MyNative();
                        obj.showParms( "Hello", 23, true );
                        obj.showParms( "World", 34, false );
                        }
                        

褰撹繍琛岃繖涓?Java 搴旂敤紼嬪簭鏃訛紝璇風‘淇?MyNative.dll 浣嶄簬 Windows 鐨?PATH 鐜鍙橀噺鎵鎸囧畾鐨勮礬寰勪腑鎴栧綋鍓嶇洰褰曚笅銆傚綋鎵ц姝?Java 紼嬪簭鏃訛紝濡傛灉鏈壘鍒拌繖涓?DLL錛屾偍鍙兘浼氱湅鍒頒互涓嬬殑娑堟伅錛?/p>
                           java MyNative
                        Can't find class MyNative
                        

榪欐槸鍥犱負 static 瀛愬彞鏃犳硶鍔犺澆榪欎釜 DLL錛屾墍浠ュ湪鍒濆鍖?MyNative 綾繪椂寮曞彂寮傚父銆侸ava 瑙i噴鍣ㄥ鐞嗚繖涓紓甯革紝騫舵姤鍛婁竴涓竴鑸敊璇紝鎸囧嚭鎵句笉鍒拌繖涓被銆?
濡傛灉鐢?-verbose 鍛戒護琛岄夐」榪愯瑙i噴鍣紝鎮ㄥ皢鐪嬪埌瀹冨洜鎵句笉鍒拌繖涓?DLL 鑰屽姞杞?UnsatisfiedLinkError 寮傚父銆?

濡傛灉姝?Java 紼嬪簭瀹屾垚榪愯錛屽氨浼氳緭鍑轟互涓嬪唴瀹癸細

                        java MyNative
                        String = [Hello]
                        int = 23
                        boolean = true
                        String = [World]
                        int
                        = 34
                        

boolean = false 紺轟緥 2 -- 榪斿洖涓涓?/strong>

鏈緥灝嗚鏄庡浣曞湪鏈湴鏂規硶涓疄鐜拌繑鍥炰唬鐮併?
灝嗚繖涓柟娉曟坊鍔犲埌 MyNative 綾諱腑錛岃繖涓被鐜板湪鍙樹負浠ヤ笅褰㈠紡錛?

                        public class MyNative
                        {
                        public void showParms( String s, int i, boolean b )
                        {
                        showParms0( s, i , b );
                        }
                        public int hypotenuse( int a, int b )
                        {
                        return hyptenuse0( a, b );
                        }
                        private native void showParms0( String s, int i, boolean b );
                        private native int  hypotenuse0( int a, int b );
                        static
                        {
                        System.loadLibrary( "MyNative" );
                        }
                        /* 嫻嬭瘯鏈湴鏂規硶 */
                        public static void main( String[] args )
                        {
                        MyNative obj = new MyNative();
                        System.out.println( obj.hypotenuse(3,4) );
                        System.out.println( obj.hypotenuse(9,12) );
                        }
                        }
                        

鍏敤鐨?hypotenuse 鏂規硶璋冪敤鏈湴鏂規硶 hypotenuse0 鏉ユ牴鎹紶閫掔殑鍙傛暟璁$畻鍊鹼紝騫跺皢緇撴灉浣滀負涓涓暣鏁拌繑鍥炪傝繖涓柊鏈湴鏂規硶鐨勫師鍨嬫槸浣跨敤 javah 鐢熸垚鐨勩傝娉ㄦ剰錛屾瘡嬈¤繍琛岃繖涓疄鐢ㄧ▼搴忔椂錛屽畠灝嗚嚜鍔ㄨ鐩栧綋鍓嶇洰褰曚腑鐨?MyNative.h銆傛寜浠ヤ笅鏂瑰紡鎵ц javah錛?/p>
 javah -jni MyNative
                        

鐢熸垚鐨?MyNative.h 鐜板湪鍖呭惈 hypotenuse0 鍘熷瀷錛屽涓嬫墍紺猴細

                        /*
                        * Class:     MyNative
                        * Method:    hypotenuse0
                        * Signature: (II)I
                        */
                        JNIEXPORT jint JNICALL Java_MyNative_hypotenuse0
                        (JNIEnv *, jobject, jint, jint);
                        

璇ユ柟娉曟槸鍦?MyNative.c 婧愭枃浠朵腑瀹炵幇鐨勶紝濡備笅鎵紺猴細

                        #include <stdio.h>
                        #include <math.h>
                        #include "MyNative.h"
                        JNIEXPORT void JNICALL Java_MyNative_showParms0
                        (JNIEnv *env, jobject obj, jstring s, jint i, jboolean b)
                        {
                        const char* szStr = (*env)->GetStringUTFChars( env, s, 0 );
                        printf( "String = [%s]\n", szStr );
                        printf( "int = %d\n", i );
                        printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );
                        (*env)->ReleaseStringUTFChars( env, s, szStr );
                        }
                        JNIEXPORT jint JNICALL Java_MyNative_hypotenuse0
                        (JNIEnv *env, jobject obj, jint a, jint b)
                        {
                        int rtn = (int)sqrt( (double)( (a*a) + (b*b) ) );
                        return (jint)rtn;
                        }
                        

鍐嶆璇鋒敞鎰忥紝jint 鍜?int 鍊兼槸鍙簰鎹㈢殑銆?
浣跨敤鐩稿悓鐨勭紪璇戣鍙ラ噸鏂扮紪璇戣繖涓?DLL錛?

                        cl -Ic:\jdk1.1.6\include -Ic:\jdk1.1.6\include\win32 -LD MyNative.c
                        -FeMyNative.dll
                        

鐜板湪鎵ц java MyNative 灝嗚緭鍑?5 鍜?15 浣滀負鏂滆竟鐨勫箋?/p>

紺轟緥 3 -- 闈欐佹柟娉?/strong>

鎮ㄥ彲鑳藉湪涓婇潰鐨勭ず渚嬩腑宸茬粡娉ㄦ剰鍒幫紝瀹炰緥鍖栫殑 MyNative 瀵硅薄鏄病蹇呰鐨勩傚疄鐢ㄦ柟娉曢氬父涓嶉渶瑕佸疄闄呯殑瀵硅薄錛岄氬父閮藉皢瀹冧滑鍒涘緩涓洪潤鎬佹柟娉曘傛湰渚嬭鏄庡浣曠敤涓涓潤鎬佹柟娉曞疄鐜頒笂闈㈢殑紺轟緥銆傛洿鏀?MyNative.java 涓殑鏂規硶絳懼悕錛屼互浣垮畠浠垚涓洪潤鎬佹柟娉曪細

                        public static int hypotenuse( int a, int b )
                        {
                        return hypotenuse0(a,b);
                        }
                        ...
                        private static native int  hypotenuse0( int a, int b );
                        

鐜板湪榪愯 javah 涓?hypotenuse0鍒涘緩涓涓柊鍘熷瀷錛岀敓鎴愮殑鍘熷瀷濡備笅鎵紺猴細

                        /*
                        * Class:     MyNative
                        * Method:    hypotenuse0
                        * Signature: (II)I
                        */
                        JNIEXPORT jint JNICALL Java_MyNative_hypotenuse0
                        (JNIEnv *, jclass, jint, jint);
                        

C 婧愪唬鐮佷腑鐨勬柟娉曠鍚嶅彉浜嗭紝浣嗕唬鐮佽繕淇濇寔鍘熸牱錛?/p>
                        JNIEXPORT jint JNICALL Java_MyNative_hypotenuse0
                        (JNIEnv *env, jclass cls, jint a, jint b)
                        {
                        int rtn = (int)sqrt( (double)( (a*a) + (b*b) ) );
                        return (jint)rtn;
                        }
                        

鏈川涓婏紝jobject 鍙傛暟宸插彉涓?jclass 鍙傛暟銆傛鍙傛暟鏄寚鍚?MyNative.class 鐨勪竴涓彞鏌勩俶ain 鏂規硶鍙洿鏀逛負浠ヤ笅褰㈠紡錛?/p>
                        public static void main( String[] args )
                        {
                        System.out.println( MyNative.hypotenuse( 3, 4 ) );
                        System.out.println( MyNative.hypotenuse( 9, 12 ) );
                        }
                        

鍥犱負鏂規硶鏄潤鎬佺殑錛屾墍浠ヨ皟鐢ㄥ畠涓嶉渶瑕佸疄渚嬪寲 MyNative 瀵硅薄銆傛湰鏂囧悗闈㈢殑紺轟緥灝嗕嬌鐢ㄩ潤鎬佹柟娉曘?/p>

紺轟緥 4 -- 浼犻掓暟緇?/strong>

鏈緥璇存槑濡備綍浼犻掓暟緇勫瀷鍙傛暟銆傛湰渚嬩嬌鐢ㄤ竴涓熀鏈被鍨嬶紝boolean錛屽茍灝嗘洿鏀規暟緇勫厓绱犮備笅涓涓ず渚嬪皢璁塊棶 String錛堥潪鍩烘湰綾誨瀷錛夋暟緇勩傚皢涓嬮潰鐨勬柟娉曟坊鍔犲埌 MyNative.java 婧愪唬鐮佷腑錛?

                        public static void setArray( boolean[] ba )
                        {
                        for( int i=0; i < ba.length; i++ )
                        ba[i] = true;
                        setArray0( ba );
                        }
                        ...
                        private static native void setArray0( boolean[] ba );
                        

鍦ㄦ湰渚嬩腑錛屽竷灝斿瀷鏁扮粍琚垵濮嬪寲涓?true錛屾湰鍦版柟娉曞皢鎶婄壒瀹氱殑鍏冪礌璁劇疆涓?false銆傚悓鏃訛紝鍦?Java 婧愪唬鐮佷腑錛屾垜浠彲浠ユ洿鏀?main 浠ヤ嬌鍏跺寘鍚祴璇曚唬鐮侊細

                        boolean[] ba = new boolean[5];
                        MyNative.setArray( ba );
                        for( int i=0; i < ba.length; i++ )
                        System.out.println( ba[i] );
                        

鍦ㄧ紪璇戞簮浠g爜騫舵墽琛?javah 浠ュ悗錛孧yNative.h 澶存枃浠跺寘鍚互涓嬬殑鍘熷瀷錛?/p>
                        /*
                        * Class:     MyNative
                        * Method:    setArray0
                        * Signature: ([Z)V
                        */
                        JNIEXPORT void JNICALL Java_MyNative_setArray0
                        (JNIEnv *, jclass, jbooleanArray);
                        

璇鋒敞鎰忥紝甯冨皵鍨嬫暟緇勬槸浣滀負鍗曚釜鍚嶄負 jbooleanArray 鐨勭被鍨嬪垱寤虹殑銆?
鍩烘湰綾誨瀷鏈夊畠浠嚜宸茬殑鏁扮粍綾誨瀷錛屽 jintArray 鍜?jcharArray銆?
闈炲熀鏈被鍨嬬殑鏁扮粍浣跨敤 jobjectArray 綾誨瀷銆備笅涓涓ず渚嬩腑鍖呮嫭涓涓?jobjectArray銆傝繖涓竷灝旀暟緇勭殑鏁扮粍鍏冪礌鏄氳繃 JNI 鏂規硶 GetBooleanArrayElements 鏉ヨ闂殑銆?
閽堝姣忕鍩烘湰綾誨瀷閮芥湁絳変環鐨勬柟娉曘傝繖涓湰鍦版柟娉曟槸濡備笅瀹炵幇鐨勶細

                        JNIEXPORT void JNICALL Java_MyNative_setArray0
                        (JNIEnv *env, jclass cls, jbooleanArray ba)
                        {
                        jboolean* pba = (*env)->GetBooleanArrayElements( env, ba, 0 );
                        jsize len = (*env)->GetArrayLength(env, ba);
                        int i=0;
                        // 鏇存敼鍋舵暟鏁扮粍鍏冪礌
                        for( i=0; i < len; i+=2 )
                        pba[i] = JNI_FALSE;
                        (*env)->ReleaseBooleanArrayElements( env, ba, pba, 0 );
                        }
                        

鎸囧悜甯冨皵鍨嬫暟緇勭殑鎸囬拡鍙互浣跨敤 GetBooleanArrayElements 鑾峰緱銆?
鏁扮粍澶у皬鍙互鐢?GetArrayLength 鏂規硶鑾峰緱銆備嬌鐢?ReleaseBooleanArrayElements 鏂規硶閲婃斁鏁扮粍銆傜幇鍦ㄥ氨鍙互璇誨彇鍜屼慨鏀規暟緇勫厓绱犵殑鍊間簡銆俲size 澹版槑絳変環浜?jint錛堣鏌ョ湅瀹冪殑瀹氫箟錛岃鍙傞槄 JDK 鐨?include 鐩綍涓嬬殑 jni.h 澶存枃浠訛級銆?

紺轟緥 5 -- 浼犻?Java String 鏁扮粍

鏈緥灝嗛氳繃鏈甯哥敤鐨勯潪鍩烘湰綾誨瀷錛孞ava String錛岃鏄庡浣曡闂潪鍩烘湰瀵硅薄鐨勬暟緇勩傚瓧絎︿覆鏁扮粍琚紶閫掔粰鏈湴鏂規硶錛岃屾湰鍦版柟娉曞彧鏄皢瀹冧滑鏄劇ず鍒版帶鍒跺彴涓娿?
MyNative 綾誨畾涔変腑娣誨姞浜嗕互涓嬪嚑涓柟娉曪細

                        public static void showStrings( String[] sa )
                        {
                        showStrings0( sa );
                        }
                        private static void showStrings0( String[] sa );
                        

騫跺湪 main 鏂規硶涓坊鍔犱簡涓よ榪涜嫻嬭瘯錛?

                        String[] sa = new String[] { "Hello,", "world!", "JNI", "is", "fun." };
                        MyNative.showStrings( sa );
                        

鏈湴鏂規硶鍒嗗埆璁塊棶姣忎釜鍏冪礌錛屽叾瀹炵幇濡備笅鎵紺恒?/p>
                        JNIEXPORT void JNICALL Java_MyNative_showStrings0
                        (JNIEnv *env, jclass cls, jobjectArray sa)
                        {
                        int len = (*env)->GetArrayLength( env, sa );
                        int i=0;
                        for( i=0; i < len; i++ )
                        {
                        jobject obj = (*env)->GetObjectArrayElement(env, sa, i);
                        jstring str = (jstring)obj;
                        const char* szStr = (*env)->GetStringUTFChars( env, str, 0 );
                        printf( "%s ", szStr );
                        (*env)->ReleaseStringUTFChars( env, str, szStr );
                        }
                        printf( "\n" );
                        }
                        

鏁扮粍鍏冪礌鍙互閫氳繃 GetObjectArrayElement 璁塊棶銆?
鍦ㄦ湰渚嬩腑錛屾垜浠煡閬撹繑鍥炲兼槸 jstring 綾誨瀷錛屾墍浠ュ彲浠ュ畨鍏ㄥ湴灝嗗畠浠?jobject 綾誨瀷杞崲涓?jstring 綾誨瀷銆傚瓧絎︿覆鏄氳繃鍓嶉潰璁ㄨ榪囩殑鏂規硶鎵撳嵃鐨勩傛湁鍏沖湪 Windows 涓鐞?Java 瀛楃涓茬殑淇℃伅錛岃鍙傞槄鏍囬涓?NLS Strings and JNI 鐨勪竴綃囪鏂囥?

紺轟緥 6 -- 榪斿洖 Java String 鏁扮粍

鏈鍚庝竴涓ず渚嬭鏄庡浣曞湪鏈湴浠g爜涓垱寤轟竴涓瓧絎︿覆鏁扮粍騫跺皢瀹冭繑鍥炵粰 Java 璋冪敤鑰呫侻yNative.java 涓坊鍔犱簡浠ヤ笅鍑犱釜鏂規硶錛?/p>
                        public static String[] getStrings()
                        {
                        return getStrings0();
                        }
                        private static native String[] getStrings0();
                        

鏇存敼 main 浠ヤ嬌 showStrings 灝?getStrings 鐨勮緭鍑烘樉紺哄嚭鏉ワ細

                        MyNative.showStrings( MyNative.getStrings() );
                        

瀹炵幇鐨勬湰鍦版柟娉曡繑鍥炰簲涓瓧絎︿覆銆?/p>
                        JNIEXPORT jobjectArray JNICALL Java_MyNative_getStrings0
                        (JNIEnv *env, jclass cls)
                        {
                        jstring      str;
                        jobjectArray args = 0;
                        jsize        len = 5;
                        char*        sa[] = { "Hello,", "world!", "JNI", "is", "fun" };
                        int          i=0;
                        args = (*env)->NewObjectArray(env, len, (*env)->FindClass(env, "java/lang/String"), 0);
                        for( i=0; i < len; i++ )
                        {
                        str = (*env)->NewStringUTF( env, sa[i] );
                        (*env)->SetObjectArrayElement(env, args, i, str);
                        }
                        return args;
                        }
                        

瀛楃涓叉暟緇勬槸閫氳繃璋冪敤 NewObjectArray 鍒涘緩鐨勶紝鍚屾椂浼犻掍簡 String 綾誨拰鏁扮粍闀垮害涓や釜鍙傛暟銆侸ava String 鏄嬌鐢?NewStringUTF 鍒涘緩鐨勩係tring 鍏冪礌鏄嬌鐢?SetObjectArrayElement 瀛樺叆鏁扮粍涓殑銆?/p>



鍥為〉棣?/font>


璋冭瘯

鐜板湪鎮ㄥ凡緇忎負鎮ㄧ殑搴旂敤紼嬪簭鍒涘緩浜嗕竴涓湰鍦?DLL錛屼絾鍦ㄨ皟璇曟椂榪樿鐗㈣浠ヤ笅鍑犵偣銆傚鏋滀嬌鐢?Java 璋冭瘯鍣?java_g.exe錛屽垯榪橀渶瑕佸垱寤?DLL 鐨勪竴涓?#8220;璋冭瘯”鐗堟湰銆傝繖鍙槸琛ㄧず蹇呴』鍒涘緩鍚屽悕浣嗗甫鏈変竴涓?_g 鍚庣紑鐨?DLL 鐗堟湰銆傚氨 MyNative.dll 鑰岃█錛屼嬌鐢?java_g.exe 瑕佹眰鍦?Windows 鐨?PATH 鐜鎸囧畾鐨勮礬寰勪腑鏈変竴涓?MyNative_g.dll 鏂囦歡銆傚湪澶у鏁版儏鍐典笅錛岃繖涓?DLL 鍙互閫氳繃灝嗗師鏂囦歡閲嶅懡鍚嶆垨澶嶅埗涓哄叾鍚嶇О甯︾紑 _g 鐨勬枃浠躲?/p>

鐜板湪錛孞ava 璋冭瘯鍣ㄤ笉鍏佽鎮ㄨ繘鍏ユ湰鍦頒唬鐮侊紝浣嗘偍鍙互鍦?Java 鐜澶栦嬌鐢?C 璋冭瘯鍣紙濡?Microsoft Visual C++錛夎皟璇曟湰鍦版柟娉曘傞鍏堝皢婧愭枃浠跺鍏ヤ竴涓」鐩腑銆?
灝嗙紪璇戣緗皟鏁翠負鍦ㄧ紪璇戞椂灝?include 鐩綍鍖呮嫭鍦ㄥ唴錛?

 c:\jdk1.1.6\include;c:\jdk1.1.6\include\win32
                        

灝嗛厤緗緗負浠ヨ皟璇曟ā寮忕紪璇?DLL銆傚湪 Project Settings 涓殑 Debug 涓嬶紝灝嗗彲鎵ц鏂囦歡璁劇疆涓?java.exe錛堟垨鑰?java_g.exe錛屼絾瑕佺‘淇濇偍鐢熸垚浜嗕竴涓?_g.dll 鏂囦歡錛夈傜▼搴忓弬鏁板寘鎷寘鍚?main 鐨勭被鍚嶃傚鏋滃湪 DLL 涓緗簡鏂偣錛屽垯褰撹皟鐢ㄦ湰鍦版柟娉曟椂錛屾墽琛屽皢鍦ㄩ傚綋鐨勫湴鏂瑰仠姝€?/p>

涓嬮潰鏄緗竴涓?Visual C++ 6.0 欏圭洰鏉ヨ皟璇曟湰鍦版柟娉曠殑姝ラ銆?/p>

  1. 鍦?Visual C++ 涓垱寤轟竴涓?Win32 DLL 欏圭洰錛屽茍灝?.c 鍜?.h 鏂囦歡娣誨姞鍒拌繖涓」鐩腑銆?




  • 鍦?Tools 涓嬫媺寮忚彍鍗曠殑 Options 璁劇疆涓嬭緗?JDK 鐨?include 鐩綍銆備笅闈㈢殑瀵硅瘽妗嗘樉紺轟簡榪欎簺鐩綍銆?


  • 閫夋嫨 Build 涓嬫媺寮忚彍鍗曚笅鐨?Build MyNative.dll 鏉ュ緩绔嬭繖涓」鐩傜‘淇濆皢欏圭洰鐨勬椿鍔ㄩ厤緗緗負璋冭瘯錛堣繖閫氬父鏄己鐪佸鹼級銆?
  • 鍦?Project Settings 涓嬶紝璁劇疆 Debug 閫夐」鍗℃潵璋冪敤閫傚綋鐨?Java 瑙i噴鍣紝濡備笅鎵紺猴細


褰撴墽琛岃繖涓▼搴忔椂錛屽拷鐣?#8220;鍦?java.exe 涓壘涓嶅埌浠諱綍璋冭瘯淇℃伅”鐨勬秷鎭傚綋璋冪敤鏈湴鏂規硶鏃訛紝鍦?C 浠g爜涓緗殑浠諱綍鏂偣灝嗗湪閫傚綋鐨勫湴鏂瑰仠姝?Java 紼嬪簭鐨勬墽琛屻?/p>



鍥為〉棣?/font>


鍏朵粬淇℃伅

JNI 鏂規硶鍜?C++

涓婇潰榪欎簺紺轟緥璇存槑浜嗗浣曞湪 C 婧愭枃浠朵腑浣跨敤 JNI 鏂規硶銆傚鏋滀嬌鐢?C++錛屽垯璇峰皢鐩稿簲鏂規硶鐨勬牸寮忎粠錛?/p>
 (*env)->JNIMethod( env, .... );
                        

鏇存敼涓猴細

 env->JNIMethod( ... );
                        

鍦?C++ 涓紝JNI 鍑芥暟琚湅浣滄槸 JNIEnv 綾葷殑鎴愬憳鏂規硶銆?/p>

瀛楃涓插拰鍥藉璇█鏀寔

鏈枃涓嬌鐢ㄧ殑鎶鏈敤 UTF 鏂規硶鏉ヨ漿鎹㈠瓧絎︿覆銆備嬌鐢ㄨ繖浜涙柟娉曞彧鏄負浜嗘柟渚胯搗瑙侊紝濡傛灉搴旂敤紼嬪簭闇瑕佸浗瀹惰璦鏀寔 (NLS)錛屽垯涓嶈兘浣跨敤榪欎簺鏂規硶銆傛湁鍏沖湪 Windows 鍜?NLS 鐜涓鐞?Java 瀛楃涓叉紜柟娉曪紝璇峰弬鏍囬涓?NLS Strings and JNI 鐨勪竴綃囪鏂囥?/p>



鍥為〉棣?/font>


灝忕粨

鏈枃鎻愪緵鐨勭ず渚嬬敤鏈甯哥敤鐨勬暟鎹被鎹紙濡?jint 鍜?jstring錛夎鏄庝簡濡備綍瀹炵幇鏈湴鏂規硶錛屽茍璁ㄨ浜?Windows 鐗瑰畾鐨勫嚑涓棶棰橈紝濡傛樉紺哄瓧絎︿覆銆傛湰鏂囨彁渚涚殑紺轟緥騫舵湭鍖呮嫭鍏ㄩ儴 JNI錛孞NI 榪樺寘鎷叾浠栧弬鏁扮被鍨嬶紝濡?jfloat銆乯double銆乯short銆乯byte 鍜?jfieldID錛屼互鍙婄敤鏉ュ鐞嗚繖浜涚被鍨嬬殑鏂規硶銆傛湁鍏寵繖涓富棰樼殑璇︾粏淇℃伅錛岃鍙傞槄 Sun Microsystems 鎻愪緵鐨?Java 鏈湴鎺ュ彛瑙勮寖銆?/p>

鍏充簬浣滆?/span>

 

David Wendt 鏄?IBM WebSphere Studio 鐨勪竴鍚嶇▼搴忓憳錛岃宸ヤ綔瀹や綅浜庡寳鍗$綏鑾辯撼宸炵殑 Research Triangle Park銆傚彲浠ラ氳繃 wendt@us.ibm.com 涓庝粬鑱旂郴銆?/p>




騫藉菇 2008-08-08 05:17 鍙戣〃璇勮
]]>
swing涓璊FileChooser鐨勭敤娉?/title><link>http://www.shnenglu.com/justin-shi/archive/2008/08/08/58297.html</link><dc:creator>騫藉菇</dc:creator><author>騫藉菇</author><pubDate>Thu, 07 Aug 2008 17:38:00 GMT</pubDate><guid>http://www.shnenglu.com/justin-shi/archive/2008/08/08/58297.html</guid><wfw:comment>http://www.shnenglu.com/justin-shi/comments/58297.html</wfw:comment><comments>http://www.shnenglu.com/justin-shi/archive/2008/08/08/58297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/justin-shi/comments/commentRss/58297.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/justin-shi/services/trackbacks/58297.html</trackback:ping><description><![CDATA[1銆佸熀鏈敤娉?br><br>JFileChooser dlg = new JFileChooser();<br>dlg.setDialogTitle("Open JPEG file");<br>int result = dlg.showOpenDialog(this);  // 鎵撳紑"鎵撳紑鏂囦歡"瀵硅瘽妗?br>// int result = dlg.showSaveDialog(this);  // 鎵?寮淇濆瓨鏂囦歡"瀵硅瘽妗?br>if (result == JFileChooser.APPROVE_OPTION) {<br>File file = dlg.getSelectedFile();<br>...<br>}<br><br> <p>2銆佽嚜瀹氫箟FileFilter</p> <p>JDK娌℃湁鎻愪緵榛樿鐨勬枃浠惰繃婊ゅ櫒錛屼絾鎻愪緵浜嗚繃婊ゅ櫒鐨勬娊璞¤秴綾伙紝鎴戜滑鍙互緇ф壙瀹冦?/p> <p>import javax.swing.filechooser.FileFilter;</p> <p>public final class PictureFileFilter extends FileFilter {<br><br>private String extension;<br><br>private String description;</p> <p>public PictureFileFilter(String extension, String description) {<br>super();<br>this.extension = extension;<br>this.description = description;<br>}</p> <p>public boolean accept(File f) {<br>if (f != null) {<br>if (f.isDirectory()) {<br>return true;<br>}<br>String extension = getExtension(f);<br>if (extension != null && extension.equalsIgnoreCase(this.extension)) {<br>return true;<br>}<br>}<br>return false;<br>}</p> <p>public String getDescription() {<br>return description;<br>}</p> <p>private String getExtension(File f) {<br>if (f != null) {<br>String filename = f.getName();<br>int i = filename.lastIndexOf('.');<br>if (i > 0 && i < filename.length() - 1) {<br>return filename.substring(i + 1).toLowerCase();<br>}<br>}<br>return null;<br>}</p> <p>}</p> <p>鍏跺疄涓昏灝辨槸accept(File f)鍑芥暟銆備笂渚嬩腑鍙湁涓涓繃婊ゅ櫒錛屽涓繃婊ゅ櫒鍙弬鑰僇DK鐩綍涓?#8220;demo\jfc\FileChooserDemo\src”涓殑“ExampleFileFilter.java”<br></p> <p><br>3銆佸閫?/p> <p>鍦ㄥ熀鏈敤娉曚腑錛岃緗?/p> <p>c.setMultiSelectionEnabled(true);</p> <p>鍗沖彲瀹炵幇鏂囦歡鐨勫閫夈?/p> <p>璇誨彇閫夋嫨鐨勬枃浠舵椂闇浣跨敤</p> <p>File[] files = c.getSelectedFiles();<br><br></p> <p>4銆侀夋嫨鐩綍</p> <p>鍒╃敤榪欎釜鎵撳紑瀵硅瘽妗嗭紝涓嶄粎鍙互閫夋嫨鏂囦歡錛岃繕鍙互閫夋嫨鐩綍銆?/p> <p>鍏跺疄錛屽璇濇鏈変竴涓狥ileSelectionMode灞炴э紝鍏墮粯璁ゅ間負“JFileChooser.FILES_ONLY”錛屽彧闇瑕佸皢鍏朵慨鏀逛負“JFileChooser.DIRECTORIES_ONLY”鍗沖彲銆?/p> <p>JFileChooser c = new JFileChooser();<br>c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);<br>c.setDialogTitle("Select path to save");<br>int result = c.showOpenDialog(PrintDatetime.this);<br>if (result == JFileChooser.APPROVE_OPTION) {<br>String path = c.getSelectedFile().getAbsolutePath());<br>...<br>}</p> <img src ="http://www.shnenglu.com/justin-shi/aggbug/58297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/justin-shi/" target="_blank">騫藉菇</a> 2008-08-08 01:38 <a href="http://www.shnenglu.com/justin-shi/archive/2008/08/08/58297.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.jytextile.cn" target="_blank">久久久久久久97</a>| <a href="http://www.ruixianscyz.cn" target="_blank">国产成人精品久久</a>| <a href="http://www.fvxg.cn" target="_blank">国产情侣久久久久aⅴ免费</a>| <a href="http://www.floodlighting.cn" target="_blank">久久久久亚洲精品天堂</a>| <a href="http://www.s360.com.cn" target="_blank">国内精品伊人久久久久网站</a>| <a href="http://www.51xwj.cn" target="_blank">精品无码久久久久国产动漫3d</a>| <a href="http://www.gfba.cn" target="_blank">99久久婷婷国产综合亚洲</a>| <a href="http://www.hanlexin.cn" target="_blank">久久国产三级无码一区二区</a>| <a href="http://www.orzdream.cn" target="_blank">国产精品岛国久久久久</a>| <a href="http://www.clkj168.cn" target="_blank">嫩草伊人久久精品少妇AV</a>| <a href="http://www.ttkanshu.cn" target="_blank">亚洲国产天堂久久综合</a>| <a href="http://www.zzouyi.cn" target="_blank">国产99久久九九精品无码</a>| <a href="http://www.woaisheying.cn" target="_blank">亚洲AV无码久久精品成人</a>| <a href="http://www.sa88.cn" target="_blank">亚洲级αV无码毛片久久精品</a>| <a href="http://www.zzxinwen.com.cn" target="_blank">国产69精品久久久久777</a>| <a href="http://www.furuike.com.cn" target="_blank">久久精品视频一</a>| <a href="http://www.ems1.cn" target="_blank">久久久久久午夜精品</a>| <a href="http://www.ogus.cn" target="_blank">国产精品美女久久久久AV福利</a>| <a href="http://www.wxyuyang.com.cn" target="_blank">久久棈精品久久久久久噜噜</a>| <a href="http://www.pk9777.cn" target="_blank">久久久久国产精品三级网</a>| <a href="http://www.3secshop.cn" target="_blank">99热热久久这里只有精品68</a>| <a href="http://www.ominimo.cn" target="_blank">国产精品一久久香蕉国产线看观看</a>| <a href="http://www.yanggroup.cn" target="_blank">亚洲v国产v天堂a无码久久</a>| <a href="http://www.dlucai.cn" target="_blank">模特私拍国产精品久久</a>| <a href="http://www.rahd.cn" target="_blank">青青青青久久精品国产h久久精品五福影院1421 </a>| <a href="http://www.gwuq.cn" target="_blank">久久国产精品-国产精品</a>| <a href="http://www.wubaili.com.cn" target="_blank">久久亚洲精品无码AV红樱桃</a>| <a href="http://www.voos.org.cn" target="_blank">一级a性色生活片久久无少妇一级婬片免费放 </a>| <a href="http://www.kklnpfvjt.cn" target="_blank">久久线看观看精品香蕉国产</a>| <a href="http://www.bachou.com.cn" target="_blank">国产精品美女久久久</a>| <a href="http://www.knjmj.cn" target="_blank">亚洲AV无码久久精品色欲</a>| <a href="http://www.callmanager.cn" target="_blank">久久亚洲精品无码aⅴ大香 </a>| <a href="http://www.icxin.cn" target="_blank">久久se精品一区二区影院</a>| <a href="http://www.zhy-gl.cn" target="_blank">久久久国产精品福利免费</a>| <a href="http://www.dyph.net.cn" target="_blank">国产精品久久午夜夜伦鲁鲁</a>| <a href="http://www.gdhaojulai.cn" target="_blank">无码国内精品久久人妻蜜桃</a>| <a href="http://www.hrwp.net.cn" target="_blank">亚洲va久久久噜噜噜久久天堂</a>| <a href="http://www.kouziye.cn" target="_blank">五月丁香综合激情六月久久</a>| <a href="http://www.hjte.cn" target="_blank">久久久久国产精品人妻</a>| <a href="http://www.110xi.cn" target="_blank">亚洲精品无码专区久久久</a>| <a href="http://www.geekon.com.cn" target="_blank">久久影院综合精品</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>