<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走在架構(gòu)師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項目管理 Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks
     

             JavaC++JNI編程小結(jié)
                                   --- jack 于湖大

     1.       什么是 JNI

        JNIJava Native Interface的縮寫。從Java 1.1開始,JNI標(biāo)準(zhǔn)成為java平臺的一部分,它允許Java和其他語言進(jìn)行交互。JNI一開始為CC++而設(shè)計的,但是它并不妨礙你使用其他語言,只要調(diào)用約定受支持就可以了。

          使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬件、操作系統(tǒng)進(jìn)行交互,或者為了提高程序的性能。

       關(guān)于 JNI 的用法很簡單,有點像 java 里的 reflect 的工作機(jī)制,有興趣的朋友可以參看更詳細(xì)的書

    2.       JNI 開發(fā)步驟

    l          編寫帶有native聲明的方法的java

    l          使用javac IDE(JBuilder,eclipse)編譯所編寫的java

    l          使用javah -jni java類名生成擴(kuò)展名為h的頭文件

    l          使用C++ 實現(xiàn)本地方法,對調(diào)用簽名可用 javap –s –p [類全名] 查看(開發(fā) C++ 動態(tài)鏈接庫本例是用的 VC6

    注意要從 JDK下面的 include 文件夾中把 jni.h jni_md.h 兩個文件 copy 到你的 VC 工程里

    l          Java load 動態(tài)鏈接庫文件,調(diào)用 native 方法

    3.       開發(fā)實例

    1.        編寫 Java : (我的 IDE eclipse)

    /**

     * Jack.Wang

     */

    package org.jm.jni;

    import java.util.ArrayList;

    /**

     * @author Jack.Wang

     * @time Mar 1, 2008

     */

    public class BackgroundProcess {

       static {

            System.loadLibrary("org_jm_jni_BackgroundProcess");

    }

    // 三個 native 方法和一個 int 變量

        public native boolean checkValid();

        public native void processData(BackgroundProcess bg);

        public native void processGarbage(String[] bg);

        public int num = 5;

        // C++ 中可以調(diào)用的方法

        public String backProcess(ArrayList<String> p) {

            System.out.println("這是 Java 里的方法,在 C++ 中調(diào)用。");

            System.out.println("這個方法,是 java native checkValid 方法調(diào)用的。");

            return "look up process ->" + p;

        }

        public static void main(String[] args) {

            String[] array = new String[4];

            array[0] = "jack";

            array[1] = "maggie";

            array[2] = "rocket";

            array[3] = "tom";

            BackgroundProcess bgP = new BackgroundProcess();

            // 調(diào)用 C++ DLL 中定義的方法。

            bgP.checkValid();// 該方法回調(diào) java 中的 backProcess 方法

            bgP.processData(bgP);

            bgP.processGarbage(array);

            // C++ DLL 改變了該變量

            System.out.println("number 現(xiàn)在的值是: " + bgP.num);

        }

    }

    2.        生成 C++ 的頭文件(javah 命令生成,用javap –s –p [類全名] 命令查看java 方法簽名

    /* DO NOT EDIT THIS FILE - it is machine generated */

    #include "jni.h"

    /* Header for class org_jm_jni_BackgroundProcess */

    #ifndef _Included_org_jm_jni_BackgroundProcess

    #define _Included_org_jm_jni_BackgroundProcess

    #ifdef __cplusplus

    extern "C" {

    #endif

    /*

     * Class:     org_jm_jni_BackgroundProcess

     * Method:    checkValid

     * Signature: ()Z

     */

    JNIEXPORT jboolean JNICALL Java_org_jm_jni_BackgroundProcess_checkValid

     (JNIEnv *, jobject);

    /*

     * Class:     org_jm_jni_BackgroundProcess

     * Method:    processData

     * Signature: (Lorg/jm/jni/BackgroundProcess;)V

     */

    JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processData

     (JNIEnv *, jobject, jobject);

    /*

     * Class:     org_jm_jni_BackgroundProcess

     * Method:    processGarbage

     * Signature: ([Ljava/lang/String;)V

     */

    JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processGarbage

     (JNIEnv *, jobject, jobjectArray);

    #ifdef __cplusplus

    }

    #endif

    #endif

    3.        開發(fā) C++ DLL 的原文件 (記得要加入 jni.h jni_md.h 兩個文件)

    發(fā)布 DLL 文件, 我是配置了 path 環(huán)境變量

    #include "org_jm_jni_BackgroundProcess.h"

    #include <iostream.h>

    #include <windows.h>

    #include "string.h"

    char* jstringTostring(JNIEnv* env, jstring jstr)

    {

           char* rtn = NULL;

           jclass clsstring = env->FindClass("java/lang/String");

           jstring strencode = env->NewStringUTF("utf-8");

           jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");

           jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);

           jsize alen = env->GetArrayLength(barr);

           jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);

           if (alen > 0)

           {

                     rtn = (char*)malloc(alen + 1);

                     memcpy(rtn, ba, alen);

                     rtn[alen] = 0;

           }

           env->ReleaseByteArrayElements(barr, ba, 0);

           return rtn;

    }

    //char* to jstring

    jstring stoJstring(JNIEnv* env, const char* pat)

    {

           jclass strClass = env->FindClass("Ljava/lang/String;");

           jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");

           jbyteArray bytes = env->NewByteArray(strlen(pat));

           env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);

           jstring encoding = env->NewStringUTF("utf-8");

           return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);

    }

    /*

    * Class:     org_jm_jni_BackgroundProcess

    * Method:    checkValid

    * Signature: ()Z

    */

    JNIEXPORT jboolean JNICALL Java_org_jm_jni_BackgroundProcess_checkValid

    (JNIEnv *env, jobject obj){

    jclass bgpClass=env->GetObjectClass(obj);

    jmethodID methodId=env->GetMethodID(bgpClass,"backProcess","(Ljava/util/ArrayList;)Ljava/lang/String;");

    jobject str=env->CallObjectMethod(obj,methodId,NULL);

    jfieldID fieldId=env->GetFieldID(bgpClass,"num","I");

    jint number=env->GetIntField(obj,fieldId);

    cout << "number 值是: " <<number << endl;

    env->SetIntField(obj,fieldId,100L);

    return 1;    

    }

    /*

    * Class:     org_jm_jni_BackgroundProcess

    * Method:    processData

    * Signature: (Lorg/jm/jni/BackgroundProcess;)V

    */

    JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processData

    (JNIEnv *env, jobject, jobject){

    cout<< "this function do nothing " << endl;

    }

    /*

    * Class:     org_jm_jni_BackgroundProcess

    * Method:    processGarbage

    * Signature: ([Ljava/lang/String;)V

    */

    JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processGarbage

    (JNIEnv *env, jobject, jobjectArray array){

    jint size=env->GetArrayLength(array);

    cout << "數(shù)組大小是: " << size << endl;

    jstring tempObj=NULL;

        char *pszSTR1 = NULL;

    for(int i=0;i<size;i++){

               cout << "current value is : " << i << endl;

               tempObj=(jstring)env->GetObjectArrayElement(array,i);

               const char * chars =env->GetStringUTFChars(tempObj, 0); 

        cout << chars << endl; 

       }

    }

    4.        現(xiàn)在你可以在 Java C++ 之間互調(diào)了

     





    本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。
    posted on 2008-03-02 08:23 Jack.Wang 閱讀(8933) 評論(4)  編輯  收藏 所屬分類: 開發(fā)技術(shù)

    Feedback

    # re: Java與C++之JNI編程小結(jié) 2008-03-02 14:53 xifu
    田里影院  回復(fù)  更多評論
      

    # re: Java與C++之JNI編程小結(jié) 2008-03-03 12:29 Jack.Wang
    有問題可以討論  回復(fù)  更多評論
      

    # re: Java與C++之JNI編程小結(jié) 2008-03-03 12:29 Jack.Wang
    @xifu
    什么意思  回復(fù)  更多評論
      

    # re: Java與C++之JNI編程小結(jié) 2008-03-07 11:52 rocket
    兩個OO語言寫出來的process式方法。。。
    jack,寫完你就不能用OO重構(gòu)一下嗎,呵呵  回復(fù)  更多評論
      

    主站蜘蛛池模板: 亚洲资源在线观看| 久久久久国产精品免费免费搜索| 日韩免费视频网站| 久久久久久久久久国产精品免费| 无人视频免费观看免费视频| 亚洲国产精品成人久久| 精品久久8x国产免费观看| 亚洲av成本人无码网站| 久久亚洲国产精品一区二区| 免费久久精品国产片香蕉| 日韩电影免费在线观看中文字幕 | 特级毛片全部免费播放a一级| 亚洲一级毛片免观看| 免费国产成人午夜电影| 成年女人男人免费视频播放| 日本免费人成在线网站| 99视频免费播放| 久草视频在线免费看| 免费久久人人爽人人爽av| 一级毛片aaaaaa视频免费看| 香港一级毛片免费看| 香蕉视频在线观看免费| 大桥未久亚洲无av码在线| 亚洲乱码无人区卡1卡2卡3| 涩涩色中文综合亚洲| 2020国产精品亚洲综合网| 国产精品亚洲片在线观看不卡| 亚洲成a人片在线观看久| 日韩在线免费视频| 国产h视频在线观看网站免费| 最近新韩国日本免费观看| 中文字幕免费高清视频| **一级毛片免费完整视| 亚洲网站免费观看| 无遮免费网站在线入口| 无码永久免费AV网站| 日韩精品在线免费观看| 一区二区三区四区免费视频| 久久免费视频精品| av无码免费一区二区三区| 成年女人毛片免费观看97|