- bindings-generator 成功生成 api/ x.js 和 autogentestbindings.cpp 和autogentestbindings.hpp 。
- js_module_register.cpp里面加入sc->addRegisterCallback(register_all_autogentestbindings);注册代码,然后把对应cpp和hpp以及C++实现文件拷贝过来。
3.cocos-2dx-lite编译成功。
4 如何让javascript层的framework关联这个新增的api,另外一个问题就是生成的api/x.js这个文件是应该放在什么地方呢?
同问。。非creator版本的jsb绑定方法。
生成后js被放到frameworks/cocos2d-x/cocos/scripting/js-bindings/auto/api里,如何被项目引用到?
在project.json里声明会报错。
api/x.js 没有用处,只是提示绑定 API 结果的,并不能运行
只要 C++ 中注册成功,编译成功,在 JSB 环境下就可以使用你绑定的 API 了,并不需要额外的 JS 代码。如果你希望在 web 端也可以使用同样的 API,需要在 web 端独立实现,JSB 的绑定是无法在 Web 端使用的
请教一个问题昨天直播过程中,所说的entity componet是指的哪一些代码啊?
这些散落在引擎中,比如 engine/cocos2d/core/components
换句话说,engine 有一部分代码是属于native和html engine之上的公共层,都是属于https://github.com/cocos-creator/engine。其实代码工程结构和您上次直播说的架构还不完全一致。
个人愚见是否是公共层是一个project,分开html与native一个工程,这样更易理解。
另外目前遇到一个问题2>…\auto\iflytek_auto.cpp(337): error C2664: ��void jsb_ref_init(JSContext *,JS
::Heap<JSObject *> *,cocos2d::Ref *,const char *) SimpleNative
Class cocos2d::Ref * reinterpret_cast C
应该是强制转换的问题,我用的simple code里面的class,自动绑定有一段这样的代码
do {
if (argc == 0) {
cobj = new (std::nothrow) SimpleNativeClass();
js_type_class_t *typeClass = js_get_type_from_native<SimpleNativeClass>(cobj);
JS::RootedObject proto(cx, typeClass->proto.ref());
JS::RootedObject parent(cx, typeClass->parentProto.ref());
obj = JS_NewObject(cx, typeClass->jsclass, proto, parent);
js_proxy_t* p = jsb_new_proxy(cobj, obj);
## jsb_ref_init(cx, &p->obj, cobj, "SimpleNativeClass");
}
} while(0);
SimpleNativeClass不是extends Ref的,这个地方是否有问题,或这个说自动jsb的class必须继承与Ref
先说你遇到的问题,jsb_ref_init 只能用于 ref 的子类,因为里面对引用计数机制进行了特殊处理。如果你的类不是一个 Ref 类,那么就不需要这个操作,你需要用的是 jsb_create_weak_jsobject。需要注意的是,正由于引用计数机制的存在,JS 层对象才能够持有 C++ 对象的引用,使得 C++ 对象在 JS 对象生命周期内始终可以访问,而使用 jsb_create_weak_jsobject 是无法同步 C++ 和 JS 对象生命周期的,在 C++ 和 JS 层都需要分别维护他们的生命周期。
在这里你想做的实际上是创建一个原生对象的 JS 对象,正确的做法是:
cobj = new (std::nothrow) SimpleNativeClass();
js_type_class_t *typeClass = js_get_type_from_native<SimpleNativeClass>(cobj);
// link the native object with the javascript object
JS::RootedObject jsobj(cx, jsb_create_weak_jsobject(cx, cobj, typeClass, "SimpleNativeClass"));
具体点的话,jsb_create_weak_jsobject 是根据你给出的类型(如果有绑定的话)创建 js 对象,然后创建 js 对象到 c++ 对象的 proxy,这个 proxy 只有在 C++ 对象和 JS 对象同时存在的情况下才有意义。
这个可以这么理解,engine 中包含了 html5 engine base,还有 EC 层框架,这部分 EC 层框架在项目打包的时候会被打包成 jsb_polyfill.js 并被 JSB 环境所引用,但是 html5 engine base 是不会被打包到 jsb 中的。
@panda大神,问题的关键其实是,你们提供的bindings-generator自动绑定工具,他生成的代码带这个jsb_ref_init。我的问题其实是,我是什么地方配置不正确吗。其实都是使用的bindings-generator\test的例子。使用就是test.ini和test.pytest.zip (2.5 KB)
另外的请求,就是周二的视频因为略过了这个部分,能否下次直播或者视频教程里,能有一个简单的simple_class整个可以被上层js调用的完全的一个演示,感谢
不应该呀,你用的 bindings generator 版本是什么?从哪里获取的?最新的版本中应该能够区分出 SimpleNativeClass 不是 ref 类,然后做正确的处理的,而且你给出的代码里面看上去不像是最新版本生成的
我已经找到这个bug了,应该是说构造函数有,参数复制的时候就有问题
SimpleNativeClass();
SimpleNativeClass(int m) : m_someField(m) {};
SimpleNativeClass(int m1, int m2) : m_someField(m1), m_someOtherField(m2) {};
去掉下面两个,直接带成员赋值的构造,编译出来就对了,应该是工具还是有bug,麻烦你们再查一下了
嗯,谢谢反馈~
另外就是target_namespace = cc的问题。用cc可以用,用我自定义的js这边调用会报错,找不到,如果要自己新建namespace需要做一些什么特殊处理吗?
看一下你指定的命名空间有没有定义,如果有问题的话我看看怎么修复
target_namespace = custom我之前只是这样在ini里面写了,后续还要做什么额外的吗?我记得直播当时说的不用做什么东西?