cocos2d-x中經過Jni實現Java與C++的互相調用。
java
cocos2d-x用開發者提供了一個類JniHelper,提供了java與c++之間互調的jni解決方案。android
筆者所開發的「史上最坑爹的遊戲」項目中使用到了JNI,爲此專門定義了一個類JniUtil.c++
頭文件JniUtil.h中須要引入以下兩個.h文件:ide
#include <jni.h> #include "platform/android/jni/JniHelper.h"
經過C++調用Java函數
聲明一個函數,專門用於處理從C++調用Java的方法,全部調用Java的地方都走這個函數。post
這樣能夠減小jni代碼,經過Json來傳遞具體的調用指令,在java那邊經過switch來進行區分,而後再經過java去調用具體的方法。spa
static void callJni(const char * data);
在JniUtil.cpp文件中以下實現:code
void JniUtil::callJni(const char *data){ JniMethodInfo minfo;//定義Jni函數信息結構體 //getStaticMethodInfo 次函數返回一個bool值表示是否找到此函數 const char * jniClass = "com/xxxx/xxxx/xxxxxxxx";//這裏寫你所要調用的java代碼的類名 bool isHave = JniHelper::getStaticMethodInfo(minfo,jniClass,"callJni","(Ljava/lang/String;)V");//本人在此傳遞的參數是字符串 if (!isHave) { CCLog("jni->%s/callJni:此函數不存在", jniClass); }else{ CCLog("jni->%s/callJni:此函數存在", jniClass); jstring jdata = minfo.env->NewStringUTF(data); //調用此函數 minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,jdata); } CCLog("jni-java函數執行完畢"); }
Java的實現:orm
public static void callJni(final String data) { mHandler.postDelayed(new Runnable() { @Override public void run() { //這裏處理C++傳遞過來的數據 } }, 100); }
經過Java代碼調用C++遊戲
//在java類中定義一個方法,用於提供給java調用C++ private static native void xxxxxx(int value);
在JniUtil.cpp中做以下實現:
extern "C" { //方法名與java類中的包名+方法名,如下劃線鏈接 void Java_com_xxxx_xxxx_xxxx_xxxx(JNIEnv* env, jobject thiz, jint a) { //這裏java調用nativePaySuccess(1);,這裏就會被調用。jint a = 1 } }