cocos2d-x中經過Jni實現Java與C++的互相調用

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
        
    }
}
相關文章
相關標籤/搜索