zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    python学习笔记——拾
    python学习笔记——玖
    Python 实现栈与队列
    Vijos1774 机器翻译 [模拟]
    Vijos1788 第K大 [模拟]
    Python 序列求和
    HDU 2102 A计划 DFS与BFS两种写法 [搜索]
    Python 多组输入
    Python 文件读写
    HDU 2068 RPG错排 [错排公式]
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7191490.html
Copyright © 2011-2022 走看看