cocos2d-html5 javascript 通过C++绑定,调用java方法

1、java中的写法

/*
 * XConnectPlugin.java
 *
 *  Created on: 2014年4月30日
 *      Author: lswdonald9@gmail.com
 */
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: lswdonald9@gmail.com
 */

#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: lswdonald9@gmail.com
 */
#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: lswdonald9@gmail.com
 */

#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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值