cocos2d-html5 javascript 通过C++绑定,调用java方法
Posted zhchoutai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos2d-html5 javascript 通过C++绑定,调用java方法相关的知识,希望对你有一定的参考价值。
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方法的主要内容,如果未能解决你的问题,请参考以下文章
COCOS2D-HTML5 开发之三示例项目附源码及运行的GIF效果图