【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)
?本站文章均為?李華明Himi?原創(chuàng),轉(zhuǎn)載務(wù)必在明顯處注明:
轉(zhuǎn)載自【黑米GameDev街區(qū)】?原文鏈接:?http://www.himigame.com/android-game/725.html
? 點(diǎn)擊訂閱 ??本博客最新動(dòng)態(tài)!及時(shí)將最新博文通知您!
?
很多看過之前Himi的【iOS-cocos2d-X 游戲開發(fā)之七】整合Cocos2dX的Android項(xiàng)目到Xcode項(xiàng)目中,Xcode編寫&編譯代碼,Android導(dǎo)入打包運(yùn)行即可!?博文的童鞋都在問我如何在Xcode中能調(diào)用Java的函數(shù),比如在Android端需要加入廣告、支付、等第三方平臺或者單獨(dú)處理的一些代碼;那么本篇Himi分享如何在Cocos2dx中訪問調(diào)用Android的Java層函數(shù);
首先Himi大概的介紹一個(gè)類?JniHelper ;
此類主要用于Jni與Java層之間的相互訪問的作用,那么此類的常用的一些函數(shù)這里首先介紹下,否則直接上代碼不太容易吸收 ;
JniHelper 類常用函數(shù):
?1. ?getStaticMethodInfo ? ?(四個(gè)參數(shù),bool 返回值)
使用示例代碼:
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun", "()V");
此函數(shù)主要用于獲取Java定義的類靜態(tài)函數(shù)是否存在,返回bool;
此函數(shù)有3個(gè)參數(shù):
第一參數(shù):?minfo ?->JniMethodInfo 類型,后面詳細(xì)說;
第二個(gè)參數(shù):類的路徑。
第三個(gè)參數(shù):方法名(第一參數(shù)類中的函數(shù))
第四個(gè)參數(shù):(參數(shù))返回類型
關(guān)于第一個(gè)和第二個(gè)參數(shù)都比較容易理解,那么第三個(gè)參數(shù)需要重點(diǎn)介紹一下;例如你在Java中定義一個(gè)如下函數(shù)?? public void helloJni(){};
那么getStaticMethodInfo函數(shù)第三個(gè)參數(shù)你應(yīng)該傳入 ? “()V” ?表示此函數(shù)無參無返回值!
如果有這么一個(gè)函數(shù):?public int helloJni(int _int){return 823};
那么getStaticMethodInfo函數(shù)第三個(gè)參數(shù)你應(yīng)該傳入 ? “(I)I” ?表示此函數(shù)需要傳入一個(gè)int類型的參數(shù)并且返回一個(gè)int類型!
大概說兩個(gè)童鞋們應(yīng)該基本理解了,那么下面詳細(xì)寫一些對照表,留給大家對照;
?參數(shù)、返回值樣式對照表:
?
? 這里的簽名指的就是getStaticMethodInfo函數(shù)第三個(gè)參數(shù)中傳入的樣式;
? ? ? 2. ??getMethodInfo ?類似與第一個(gè)函數(shù),只是對應(yīng)非靜態(tài)函數(shù);此函數(shù)主要用于獲取Java定義的類非靜態(tài)函數(shù)是否存在,返回bool;
?JniMethodInfo?類:
此類型主要用戶保存類結(jié)構(gòu)體,可以通過JniHelper類的getStaticMethodInfo函數(shù)實(shí)例化JniMethodInfo對象,從而使用實(shí)例的env屬性調(diào)用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函數(shù)進(jìn)行對保存的類結(jié)構(gòu)調(diào)用函數(shù);
常用的函數(shù)如下:(靜態(tài)系列函數(shù))
1. ?CallStaticVoidMethod(classID,methodID);
2.?CallStaticIntMethod(classID,methodID);
3~(n-1) ? ? ?……省略掉,童鞋們一看就明白;
n.?CallStaticObjectMethod(classID,methodID);
帶參數(shù)的函數(shù):(如int類型)
CallStaticVoidMethod(classID,methodID,int _int);
非靜態(tài)系列函數(shù): ? ? ? ?
1. ?CallVoidMethod(jobj,methodID);
2.?CallIntMethod(jobj,methodID);
3~(n-1) ? ? ?……省略掉,童鞋們一看就明白;
n.?CallStaticObjectMethod(jobj,methodID);
帶參數(shù)的函數(shù):(如int類型)
CallVoidMethod(classID,methodID,int _int);
這里講解下幾個(gè)參數(shù)函數(shù):
1. classID: 類ID ?,?JniMethodInfo 對象包含此屬性;
? ? ? ? ? ? ? ? ? 2. methdID: 方法ID,JniMethodInfo 對象也包含此屬性;
? ? ? ? ? ? ? ? ? 3. jobj ?: java中Object類型,如自定義類,String…
非靜態(tài)函數(shù)調(diào)用的時(shí)候,需要的是對象,所以與靜態(tài)函數(shù)調(diào)用的第一個(gè)參數(shù)不同;
? ? ? ? 那么既然能調(diào)用Java的函數(shù),那就能得到函數(shù)返回值,但是這里我們得到的返回值書寫類型如下:
譬如返回int 類型,在Xcode中使用 ? ? jint 這種形式,更多形式如下:
int ?-> ?jint
…省略,大家一看就懂得;
object ? -> ?jobject
估計(jì)有的童鞋已經(jīng)暈了,沒關(guān)系,下面Himi寫了一些例子代碼,結(jié)合來看就一目了然啦。
Xcode中先導(dǎo)入如下頭文件:
示例代碼段1:
Xcode 代碼:
?
?
運(yùn)行截圖:
?未完待續(xù)...(下)
轉(zhuǎn)載于:https://blog.51cto.com/xiaominghimi/908804
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发_如何调用系统默认浏览
- 下一篇: View和ViewGroup常用方法