天天看點

【iOS-cocos2d-X 遊戲開發之十三】cocos2dx通過Jni調用Android的Java層代碼(上)

首先Himi大概的介紹一個類 JniHelper ;

此類主要用于Jni與Java層之間的互相通路的作用,那麼此類的常用的一些函數這裡首先介紹下,否則直接上代碼不太容易吸收 ;

JniHelper 類常用函數:

 1.  getStaticMethodInfo    (四個參數,bool 傳回值)

使用示例代碼:

<code>bool</code> <code>isHave = JniHelper::getStaticMethodInfo(minfo,</code><code>"com/ai/ommr/OhMonsterMR4Android"</code><code>,</code><code>"testFun"</code><code>,</code><code>"()V"</code><code>);</code>

此函數主要用于擷取Java定義的類靜态函數是否存在,傳回bool;

此函數有3個參數:

第一參數: minfo  -&gt;JniMethodInfo 類型,後面詳細說;

第二個參數:類的路徑。

第三個參數:方法名(第一參數類中的函數)

第四個參數:(參數)傳回類型

關于第一個和第二個參數都比較容易了解,那麼第三個參數需要重點介紹一下;例如你在Java中定義一個如下函數   public void helloJni(){};

那麼getStaticMethodInfo函數第三個參數你應該傳入   “()V”  表示此函數無參無傳回值!

如果有這麼一個函數: public int helloJni(int _int){return 823};

那麼getStaticMethodInfo函數第三個參數你應該傳入   “(I)I”  表示此函數需要傳入一個int類型的參數并且傳回一個int類型!

大概說兩個童鞋們應該基本了解了,那麼下面詳細寫一些對照表,留給大家對照;

 參數、傳回值樣式對照表:

<a href="http://www.himigame.com/wp-content/uploads/2012/04/NVMAUDTZXE6TWIDJN08O11.jpg"></a>

  這裡的簽名指的就是getStaticMethodInfo函數第三個參數中傳入的樣式;

      2.   getMethodInfo  類似與第一個函數,隻是對應非靜态函數;此函數主要用于擷取Java定義的類非靜态函數是否存在,傳回bool;

 JniMethodInfo 類:

此類型主要使用者儲存類結構體,可以通過JniHelper類的getStaticMethodInfo函數執行個體化JniMethodInfo對象,進而使用執行個體的env屬性調用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函數進行對儲存的類結構調用函數;

常用的函數如下:(靜态系列函數)

1.  CallStaticVoidMethod(classID,methodID);

2. CallStaticIntMethod(classID,methodID);

3~(n-1)      ……省略掉,童鞋們一看就明白;

n. CallStaticObjectMethod(classID,methodID);

帶參數的函數:(如int類型)

CallStaticVoidMethod(classID,methodID,int _int);

非靜态系列函數:        

1.  CallVoidMethod(jobj,methodID);

2. CallIntMethod(jobj,methodID);

n. CallStaticObjectMethod(jobj,methodID);

CallVoidMethod(classID,methodID,int _int);

這裡講解下幾個參數函數:

1. classID: 類ID  , JniMethodInfo 對象包含此屬性;

                  2. methdID: 方法ID,JniMethodInfo 對象也包含此屬性;

                  3. jobj  : java中Object類型,如自定義類,String…

非靜态函數調用的時候,需要的是對象,是以與靜态函數調用的第一個參數不同;

        那麼既然能調用Java的函數,那就能得到函數傳回值,但是這裡我們得到的傳回值書寫類型如下:

譬如傳回int 類型,在Xcode中使用     jint 這種形式,更多形式如下:

int  -&gt;  jint

…省略,大家一看就懂得;

object   -&gt;  jobject

估計有的童鞋已經暈了,沒關系,下面Himi寫了一些例子代碼,結合來看就一目了然啦。

Xcode中先導入如下頭檔案:

//使用預編譯,對目前平台為Android時才會導入如下頭檔案 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 

#include &lt;jni.h&gt; 

#include "platform/android/jni/JniHelper.h" 

#include &lt;android/log.h&gt; 

#endif 

示例代碼段1:

Xcode 代碼:

////靜态函數示例1.無參數,無傳回值---------------------------------$$$$$$----------------------------- 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判斷目前是否為Android平台 

    JniMethodInfo minfo;//定義Jni函數資訊結構體 

    //getStaticMethodInfo 次函數傳回一個bool值表示是否找到此函數 

    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun", "()V");  

    if (!isHave) { 

        CCLog("jni:此函數不存在"); 

    }else{ 

        CCLog("jni:此函數存在"); 

        //調用此函數 

        minfo.env-&gt;CallStaticVoidMethod(minfo.classID, minfo.methodID); 

    } 

    CCLog("jni-java函數執行完畢"); 

Android(Java) 代碼:

// 靜态函數示例1.無參數,無傳回值 

public static void testFun() { 

    Log.e("Himi", "靜态函數示例1.無參數,無傳回值"); 

運作截圖:

<a href="http://www.himigame.com/wp-content/uploads/2012/04/0000.png"></a>

 <b>未完待續...(下)</b>

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/908804,如需轉載請自行聯系原作者

繼續閱讀