用default模版或者link模版会出问题么?
你的xcode版本是?
link 没有报错; Version 9.0.1 (9A1004);
好像 Version 8.x 也出错,然后我升级到9.0.1还是报错;
现在退回到 1.62后就正常了
话说,在构建android和ios的时候,模版可选 default link 还又binary ,这个模版,是什么作用呢?
对比了下,link是不含cocos2d-x的src了而多了libs,而default的是,有代码,没有库文件~
懂了~~
选择binary,编译速度快;其它2个速度好慢要等半天
IOS版本想添加个视频功能上去,发现跟 腾讯云的互动直播 冲突了;
安卓的没问题,IOS不行
duplicate symbol _alBufferDataStaticProc in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _alcMacOSXMixerOutputRateProc in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCDN_AsynchLoadComplete in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCDN_BadAlContext in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_GainDefault in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PanDefault in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PanFullLeft in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PanFullRight in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PitchDefault in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PitchHigherOneOctave in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCD_PitchLowerOneOctave in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CocosDenshion.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CocosDenshion.o)
duplicate symbol _kCDN_AudioManagerInitialised in:
/Users/chenfuquan/Desktop/cocos2d/fanweqp/build/jsb-binary/frameworks/runtime-src/proj.ios_mac/fanwe/Live/Frameworks/AVSDK/QAVSDK.framework/QAVSDK(CDAudioManager.o)
/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/prebuilt/ios/libcocos2d iOS.a(CDAudioManager.o)
ld: 12 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
目测你这个是1.6的吧?腾讯云也用了CocosDenshion?目测只能改源码解决了。
是因为构建的时候选的是android不是ios,所以才失败的
改了 CocosDenshion、CDAudioManager 这2源文件文件,可以了; 没想到腾讯云互动直播都用了相同的代码
ccui.ListView和ccui.ScrollView都没有吗?
我用 ccui.ListView.create 和ccui.ScrollView.create 都出现
E/jswrapper (142): ERROR: Uncaught TypeError: Cannot read property ‘create’ of undefined, src/scene/MainMenuUI.js:0:0
还有小声地问一下,正式版本估计什么时候出
没有了,删除了,用creator还需要ccui下面的ListView和ScrollView么?。。。
没有看到对应的error信息啊,都是warning,这前面是否有error相关的日志?
我只是用creator下面的引擎内核, 也就是resources/cocos2d-x。
感觉1.7的引擎内核,到ccui.Widget就结束了。
我能否把1.6.1的ScrollView和ListView拿过来导出绑定接口?是否有导出工具?
ccui里面还有好多东西在1.7里面没有。你们后面会考虑加上吗?如果不考虑加上,我能否把1.6.1的相关代码搬过来,然后导出绑定?
因为我目前有个H5项目,大量用到了ccui里面的这些控件,想移植到jsb上面。
那就直接用cocos2d-js的jsb啊,不建议用creator来移植且还继续用ccui下面的非creator原生支持的控件。
我是想啊。但是ScrollView和ListView的addClickEventListener的回调函数,新内存模型时,在垃圾回收时“感觉”被清掉了。这个问题困扰了我好久,一直找不到解决方案。本想看看1.7有没有此问题,但发现1.7去掉了ScrollView和ListView。尝试过3.13, 3.15, creator的1.6.1, 都发现有问题,只是表现出来的现象不一样罢了,要么崩溃,要么就是什么 null is not a function。旧内存模型却没有问题。我后来在1.6.1下调试过那段代码,确实那个函数在gc时, proxy->obj被置为了null, 可能的解释是弱引用,但百思不得其解。
那就继续用cocos2d-js旧的内存模型。
要使用creator,就用creator控件来重写你旧游戏的UI,然后再测试一下。
找到原因了,十分隐晦。
cocos creator 1.6.1中,js_cocos2dx_ui_ScrollView_create函数代码改成
bool js_cocos2dx_ui_ScrollView_create(JSContext *cx, uint32_t argc, JS::Value *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
bool ok = true; CC_UNUSED_PARAM(ok);
if (argc == 0) {
auto ret = new cocos2d::ui::ScrollView();
ret->init();
ret->autorelease();
JS::RootedObject jsret(cx);
JS::RootedObject proto(cx, jsb_cocos2d_ui_ScrollView_prototype->get());
jsb_ref_autoreleased_create_jsobject(cx, ret, jsb_cocos2d_ui_ScrollView_class, proto, &jsret, "cocos2d::ui::ScrollView");
cocos2d::ui::Layout* innerContainer = ret->getInnerContainer();
innerContainer->retain();
JS::RootedObject jsInnerContainer(cx);
js_get_or_create_jsobject<cocos2d::ui::Layout>(cx, (cocos2d::ui::Layout*)innerContainer, &jsInnerContainer);
ret->removeProtectedChild(innerContainer, false);
ret->addProtectedChild(innerContainer, 1, 1);
innerContainer->release();
args.rval().set(JS::ObjectOrNullValue(jsret));
return true;
}
JS_ReportErrorUTF8(cx, "js_cocos2dx_ui_ScrollView_create : wrong number of arguments");
return false;
}
关键原因在ScrollView和自己的_innerContainer没有建立起关系,在js层面,我不知道怎么描述。
原来的代码中的void ScrollView::initRenderer()函数:
void ScrollView::initRenderer()
{
Layout::initRenderer();
_innerContainer = Layout::create();
_innerContainer->setColor(Color3B(255,255,255));
_innerContainer->setOpacity(255);
_innerContainer->setCascadeColorEnabled(true);
_innerContainer->setCascadeOpacityEnabled(true);
addProtectedChild(_innerContainer, 1, 1);
}
问题出在addProtectedChild, 再找到addProtectedChild函数代码:
void ProtectedNode::addProtectedChild(Node *child, int zOrder, int tag)
{
.....
this->insertProtectedChild(child, zOrder);
.....
}
再找到insertProtectedChild函数代码:
// helper used by reorderChild & add
void ProtectedNode::insertProtectedChild(cocos2d::Node *child, int z)
{
#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
if (sEngine)
{
sEngine->retainScriptObject(this, child);
}
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
_reorderProtectedChildDirty = true;
_protectedChildren.pushBack(child);
child->setLocalZOrder(z);
}
再找到retainScriptObject函数代码:
void ScriptingCore::retainScriptObject(cocos2d::Ref* owner, cocos2d::Ref* target)
{
if (!_global)
{
return;
}
JS::RootedObject global(_cx, _global->get());
JS::RootedObject jsbObj(_cx);
get_or_create_js_obj(_cx, global, "jsb", &jsbObj);
JS::RootedValue jsbVal(_cx, JS::ObjectOrNullValue(jsbObj));
if (jsbVal.isNullOrUndefined())
{
return;
}
js_proxy_t *pOwner = jsb_get_native_proxy(owner);
js_proxy_t *pTarget = jsb_get_native_proxy(target);
if (!pOwner || !pTarget)
{
return;
}
JS::RootedValue valOwner(_cx, JS::ObjectOrNullValue(pOwner->obj));
JS::RootedValue valTarget(_cx, JS::ObjectOrNullValue(pTarget->obj));
if (valTarget.isPrimitive())
{
return;
}
JS::RootedValue retval(_cx);
JS::AutoValueVector valArr(_cx);
valArr.append(valOwner);
valArr.append(valTarget);
JS::HandleValueArray args(valArr);
executeFunctionWithOwner(jsbVal, "registerNativeRef", args, &retval);
}
问题就在这, pOwner 和 pTarget 对象为空,所以提前返回了。其中pOwner为ScrollView对象的代理, pTarget为innerContainer的代理。
函数提前返回导致两者的依赖关系并没有建立?从而导致ScrollView和它自己的innerContainer脱节?所以innerContainer以及其下的子节点,若用到了js对象,都会面临被GC掉的可能。
这个问题具有普遍性,也是一个巨坑。不是由脚本直接创建的对象,而是C++内部直接创建的对象,都可能会面临这个问题。
上面的修正代码只是临时解决方案。真正解决这个问题的方法,应该是,所有的C++类,只要提供了脚本访问接口,在其new出来之后就应该立即创建jsb_proxy_t对象。
非常期待引擎组能够提供帮助,解决这个问题。我估计1.7也可能有此问题。
1.7是完全不一样的绑定方式。没有什么proxy的玩意。应该不存在你说的问题。
请问各位大神,
关于模拟器没有的texture._glID / texture.getName() 的问题,
我是否有变通的方案可以使用?
或是否有pull request可以先让我自定引擎使用呢?
感谢
用1.7的 chorm调试android,连上了。但是 代码里的cc.log的内容 怎么没有打印出来?