<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團(tuán)論壇3G手機(jī)技術(shù)專(zhuān)區(qū)Android應(yīng)用開(kāi)發(fā) → Android學(xué)習(xí)開(kāi)發(fā)4--Android在C++中調(diào)用java(3)


      共有8166人關(guān)注過(guò)本帖樹(shù)形打印

    主題:Android學(xué)習(xí)開(kāi)發(fā)4--Android在C++中調(diào)用java(3)

    美女呀,離線(xiàn),留言給我吧!
    wangxinxin
      1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


    加好友 發(fā)短信
    等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
    Android學(xué)習(xí)開(kāi)發(fā)4--Android在C++中調(diào)用java(3)  發(fā)帖心情 Post By:2010-12-3 11:51:12

    5.2 java類(lèi)的實(shí)例化
    都知道java需要 obj var = new obj();這樣一個(gè)過(guò)程,我們?cè)贑++中調(diào)用java類(lèi)的成員函數(shù),當(dāng)然也要先示例話(huà)一個(gè)類(lèi)。
    示例化的函數(shù)如下所示
    jobject getInstance(JNIEnv* env, jclass obj_class)
    {
        jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
        jobject obj = env->NewObject(obj_class, construction_id);
        return obj;
    }
    這個(gè)函數(shù)中的env表示環(huán)境參數(shù),jclass表示一個(gè)java類(lèi)的句柄。
    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
    GetMethodID的參數(shù)分別為(類(lèi)句柄,方法名稱(chēng),參數(shù)名稱(chēng))
    這個(gè)是為了獲取java類(lèi)中某個(gè)方法的句柄,有一點(diǎn)需要特別注意的,在獲取構(gòu)造方法的句柄和別的方法的句柄是不一樣的。
    獲取一般方法的句柄所填寫(xiě)“方法名稱(chēng)”參數(shù)直接就是這個(gè)方法的名稱(chēng),而構(gòu)造函數(shù)的話(huà)就必須填寫(xiě)"<init>"。除了這點(diǎn)區(qū)別外,就沒(méi)有區(qū)別了。
    而我們的“參數(shù)名稱(chēng)”似乎寫(xiě)的就有些奇怪了。但是細(xì)說(shuō)下他的規(guī)律也就不怪了。
    參數(shù)名稱(chēng)的書(shū)寫(xiě)規(guī)則為 (參數(shù)1類(lèi)型,參數(shù)2類(lèi)型….)返回類(lèi)型。而相應(yīng)類(lèi)型的表示如下所示
    圖片點(diǎn)擊可在新窗口打開(kāi)查看

    比如我們要找個(gè)int func(double)類(lèi)型的函數(shù),就該這么寫(xiě):
    jmethodID construction_id = env->GetMethodID(obj_class, " func ", "(D)I");
    找到了構(gòu)造函數(shù)的方法之后我們直接調(diào)用構(gòu)造函數(shù),然后把生成的類(lèi)返回即可
    jobject obj = env->NewObject(obj_class, construction_id);
    其中obj_class為類(lèi)的句柄construction_id為構(gòu)造函數(shù)的句柄,而類(lèi)的實(shí)例被該函數(shù)返回。

    5.3 調(diào)用java類(lèi)的其他函數(shù)
    JNIEXPORT jstring JNICALL Java_com_hm_hello_CActivityMain_stringFromJNI
    (JNIEnv* env, jobject)
    {
       jstring str;
       jclass java_class = env->FindClass("com/hm/hello/CForCall");
        if (java_class == 0)
        {
           return env->NewStringUTF("not find class!");
        }
       jobject java_obj = getInstance(env, java_class);
       if (java_obj == 0)
       {
           return env->NewStringUTF("not find java OBJ!");
       }
       jmethodID java_method = env->GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");
       if(java_method == 0)
       {
           return env->NewStringUTF("not find java method!");
       }
       str = (jstring)env->CallObjectMethod(java_obj, java_method);
       return str;
    }
    看完了構(gòu)造函數(shù)的介紹,這段代碼其實(shí)很容易就看懂了,我們發(fā)現(xiàn)調(diào)用java中的函數(shù)的步驟無(wú)非幾步:
    1找到類(lèi)句柄
    2找到類(lèi)的方法的句柄
    3實(shí)例化類(lèi)
    4調(diào)用實(shí)例化類(lèi)的方法。
    而以上代碼中只有一段沒(méi)說(shuō)過(guò),就是
    jclass java_class = env->FindClass("com/hm/hello/CForCall");
    看名字就知道,是在找相應(yīng)的類(lèi)的句柄,其中com.hm.hello準(zhǔn)備調(diào)用類(lèi)的完整包名(把.轉(zhuǎn)換為/),而CforCall就是我們要調(diào)用的類(lèi)的名稱(chēng)。
    至此,編譯,然后在Android調(diào)試,可愛(ài)的機(jī)器人又出現(xiàn)了,哈哈,屏幕上顯示出現(xiàn)了12345,成功!


    支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    Android學(xué)習(xí)開(kāi)發(fā)4--Android在C++中調(diào)用java(3)








    簽名