首先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 ->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 -> jint
…省略,大家一看就懂得;
object -> jobject
估計有的童鞋已經暈了,沒關系,下面Himi寫了一些例子代碼,結合來看就一目了然啦。
Xcode中先導入如下頭檔案:
//使用預編譯,對目前平台為Android時才會導入如下頭檔案
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include <android/log.h>
#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->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,如需轉載請自行聯系原作者