Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

参考 http://www.cnblogs.com/kenkofox/p/3910462.html

参考 http://www.tairan.com/archives/4902

参考 http://cn.cocos2d-x.org/tutorial/show?id=1317

-----------------------------------------------------------------------------------------------------

iOS/Mac中使用JS调用Objective-C函数

pandamicro2014-08-12 19:33:131290 次阅读

在Cocos2d-JS v3.0 RC2中,我们将介绍JS到Objective-C的反射特性。这就像在Java中我们可以使用JS调用Java本地函数一样,你也可以使用JS调用Objective-C的静态方法。

1
varojb=jsb.reflection.callStaticMethod(className,methodNmae,arg1,arg2,.....);

可以通过传递className methodName 和 parmeters来使用jsb.reflection.callStaticMethod调用本地的OC方法。


Objective-C中的类

你需要像下面的例子一样,在OC的类中提供你的方法。下例中参数className应该是NativeOcClass。

1
2
3
4
import<Foundation/Foundation.h>
@interfaceNativeOcClass:NSObject
+( BOOL )callNativeUIWithTitle:(NSString*)titleandContent:(NSString*)content;
@end


Objective-C中的方法

  • JS到OC的反射只支持OC类中的静态方法。

  • 在之前的例子中,methodName 参数是类的OC方法名,如我们将一个方法命名为NativeOcClass。

1
+( BOOL )callNativeUIWithTitle:(NSString*)titleandContent:(NSString*)content;

因此,这个methodName应该由callNativeUIWithTitle:addContent: 来定义(注意不要忘记":")。更多详情请查看Objective-C编程指南。


  • 在下面的例子中,methodName应该为callNativeWithReturnString。

1
+(NSString*)callNativeWithReturnString;


用法

  • 在JS代码中,可使用如下的jsb.reflection.callStaticMethod API来调用NativeOcClass的本地方法callNativeUIWithTitle:andContent::

1
varret=jsb.reflection.callStaticMethod( "NativeOcClass" , "callNativeUIWithTitle:andContent:" , "cocos2d-js" , "Yes!youcallaNativeUIfromReflection" );
  • 此方法将会显示一个警告框,并返回一个布尔类状态。下面是它的实现方法,title和content参数将会接收从JS中传来的字符串。

1
2
3
4
varret=jsb.reflection.callStaticMethod("NativeOcClass",
"callNativeUIWithTitle:andContent:",
"cocos2d-js",
"Yes!youcallaNativeUIfromReflection" );


注意事项

在Cocos2d-JS反射中,支持的参数类型以及返回值是受限制的。

  • 如果需要在本地方法中使用float、int、和double类型的参数,那么你需要使用NSNumber替代。

  • 如果需要使用bool类型的参数,那么用BOOL替代。

  • 下面有个例子,使用NSNumber代替int,float以及double。

1
+( float )addTwoNumber:(NSNumber*)num1and:(NSNumber*)num2{ float result=[num1floatValue]+[num2floatValue]; return result;}
  • 当前版本仅支持int,float,bool和string的返回值类型。


如何实现c++中调用js呢,参照一下文章,

测试了下,如果是单独从c++调用js的话

<strong>jsval ret; 
 ScriptingCore::getInstance()->evalString("cpp_callback(2,3)",&ret); </strong>

第一个参数是声明函数,全局函数。 也可以是类静态函数: MyClass.method(1,2).

# import "cocosbuilder/js_bindings_ccbreader.h"


上面的js调cpp应该是封装过了,如果自己实现的话要参照下面,注册函数等。这样才可以在js中直接调用

--------------------------------------------------------------------------------------------------------------------------------------------------------------

1 JS调用C++

2 C++回调

/** 
     @brief Execute a scripted global function. 
     @brief The function should not take any parameters and should return an integer. 
     @param functionName String object holding the name of the function,in the global script environment,that is to be executed. 
     @return The integer value returned from the script function. 
     */ 
    virtual int executeGlobalFunction(const char* functionName) { return 0; }

    virtual int sendEvent(cocos2d::ScriptEvent* message) override; 
    
    virtual bool parseConfig(ConfigType type,const std::string& str) override;

    virtual bool handleAssert(const char *msg) { return false; }

    virtual void setCalledFromScript(bool callFromScript) { _callFromScript = callFromScript; }; 
    virtual bool isCalledFromScript() { return _callFromScript; }; 
    
    bool executeFunctionWithObjectData(void* nativeObj,const char *name,JSObject *obj); 
    bool executeFunctionWithOwner(jsval owner,uint32_t argc = 0,jsval* vp = NULL,jsval* retVal = NULL);

    void executeJSFunctionWithThisObj(jsval thisObj,jsval callback,jsval* retVal = NULL);

    /** 
     * will eval the specified string 
     * @param string The string with the javascript code to be evaluated 
     * @param outVal The jsval that will hold the return value of the evaluation. 
     * Can be NULL. 
     */ 
    bool evalString(const char *string,jsval *outVal,const char *filename = NULL,JSContext* cx = NULL,JSObject* global = NULL);

  

3 各种变量转换函数

----------------------------http://www.tairan.com/archives/4902------------------------------------------------------------------------------------------------------------------------------------

Cocos2d-x Js Binding 的手动绑定实现

文章目录

随着 Cocos2d-x 的发展,Cocos2d-html5 也日益完善,相比纯 C++ 的开发方式,它开发效率更为高效,而另一个显而易见的好处便是 JS 端的 API 可以作为 Cocos2d-x Javascript Bindings (JSB) 的接口封装。一套 API,两种解决方案,这让用 JS 快速开发游戏,通过 JSB 以接近原生代码的速度来运行游戏成为可能。

这里使用当前稳定版 Cocos2d-x-2.1.4,Xcode JSB 项目模板创建项目,如果是用其它 IDE ,注意配置好不同环境的依赖关系,本文的示例源码可以在【这里】看到。

JSB 手动绑定的实现步骤

要实现 C++ 到 JS 的手动绑定,首先我们需要定义一个待绑定的类,为了这里的解说简单,创建了一个非常简单的类,也只定义了些简单的方法,如下:

// Leafsoar.h 文件定义
namespace ls {
    class Leafsoar: public cocos2d::CCObject
    {
    public:
        static cocos2d::CCScene* scene();
        virtual bool init();
        CREATE_FUNC(Leafsoar);
        void functionTest();
    };
}

// Leafsoar.cpp 实现
bool ls::Leafsoar::init(){
    bool bRef = false;
    do {
        cocos2d::CCLog("leafsoar init ...");
        bRef = true;
    } while (0);
    return bRef;
}
void ls::Leafsoar::functionTest(){
    cocos2d::CCLog("function Test");
}

大佬总结

以上是大佬教程为你收集整理的cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding全部内容,希望文章能够帮你解决cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: