cocos2d-html5 javascript 通過C++綁定,調用java方法
阿新 • • 發佈:2017-07-16
setprop 綁定 gin call news .cpp argc clas end
以上部分是C++調用到java的方法,start(string)。
然後在javascript中,這樣聲明:
1、java中的寫法
/* * XConnectPlugin.java * * Created on: 2014年4月30日 * Author: [email protected] */ package org.cocos2dx.commonSDK; import android.util.Log; public class XConnectPlugin { public static void start(String str) { Log.d("mylog ", "str>>" + str); } }
2、C++中的寫法
頭文件(XInterface.h)聲明方法:
/* * XInterface.h * * Created on: 2014年4月30日 * Author: [email protected] */ #ifndef XINTERFACE_H_ #define XINTERFACE_H_ #include "string" class XInterface { public: static void start(const char* ct); }; #endif /* XINTERFACE_H_ */
XInterface.cpp中寫法:
/* * XInterface.cpp * * Created on: 2014年4月30日 * Author: [email protected] */ #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "XInterface.h" #include "platform/android/jni/JniHelper.h" #include <jni.h> #include <android/log.h> #include "ScriptingCore.h" XInterface::XInterface() { } XInterface::~XInterface() { } const char* XJavaClassName = "org/cocos2dx/commonSDK/XConnectPlugin"; void XInterface::start(const char* cLevel) { JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, XJavaClassName, "start", "(Ljava/lang/String;)V")) { if (cLevel) { jstring jLevel = t.env->NewStringUTF(cLevel); t.env->CallStaticVoidMethod(t.classID, t.methodID, jLevel); t.env->DeleteLocalRef(jLevel); } t.env->DeleteLocalRef(t.classID); } } #endif
以上部分是C++調用到java的方法,start(string)。
3、以下部分是,在SpritMonkey中註冊C++方法到javascript中
js_bindings_X.cpp
/* * jsbindingsX.cpp * * Created on: 2014年4月30日 * Author: [email protected] */ #include "ScriptingCore.h" #include "XInterface.h" JSBool JSB_X_start(JSContext *cx, uint32_t argc, jsval *vp){ std::string str; if(argc == 1) { jsval *argv = JS_ARGV(cx, vp); jsval_to_std_string(cx, argv[0], &str); XInterface::start(str.c_str()); } return JS_TRUE; } void register_X_js(JSContext* cx, JSObject* global){ jsval nsval; JSObject *XJsbObject; JS_GetProperty(cx, global, "XJsb", &nsval); if (nsval == JSVAL_VOID) { XJsbObject = JS_NewObject(cx, NULL, NULL, NULL); nsval = OBJECT_TO_JSVAL(XJsbObject); JS_SetProperty(cx, global, "XJsb", &nsval); } else JS_ValueToObject(cx, nsval, &XJsbObject); JS_DefineFunction(cx, XJsbObject, "start", JSB_X_start, 1, JSPROP_READONLY | JSPROP_PERMANENT); }
然後在javascript中,這樣聲明:
var XJsb = XJsb || { start : function () { } };註意。這裏的XJsb跟c++ 中的register_x_js 保持一致.
然後在,須要調用的地方。觸發:
XJsb.start("from javaScript");須要註意,在AppDelegate.cpp中。增加
extern void register_X_js(JSContext* cx, JSObject* global);和
ScriptingCore* sc = ScriptingCore::getInstance(); sc->addRegisterCallback(register_X_js);在Android.mk中的LOCAL_SRC_FILES加入:
LOCAL_SRC_FILES := ../../Classes/XInterface.cpp ../../Classes/js_bindings_X.cpp
最後的結果就出來了:from javaScript
cocos2d-html5 javascript 通過C++綁定,調用java方法