[已解决] Cocos creator 上 protobufjs 报错

重现步骤:
cocos creator 1.3.3
新建helloworld工程
在工程目录下执行 npm install protobufjs
在随便一个场景的button点击事件执行以下代码

on_click_button: function() {

    var VIEW = this;

    var file = './resources/proto/awesome.proto';
    var file_url = cc.url.raw(file);

    cc.loader.load(file_url, function(err, tex) {
        cc.log('loaded = ', tex);

        var protobuf = require('protobufjs');
        cc.log("load protobuf=", protobuf);

        var pr = protobuf.parse(tex);
        cc.log("load pr =", pr);

        var AwesomeMessage = pr.root.lookup("awesomepackage.AwesomeMessage");
        cc.log("AwesomeMessage = ", AwesomeMessage);

            // Create a new message 
            var message = AwesomeMessage.create({
                awesomeField: "AwesomeString",
                testErr: "asdfasdf"
            });

            // Encode a message 
            var buffer1 = AwesomeMessage.encode(message).finish();

            // Decode a buffer 
            var message = AwesomeMessage.decode(buffer1);

            cc.log(" field = " + message.awesomeField + " \n test = " + message.testErr);
    });
},

保存执行, 浏览器OK, windows模拟器OK, 但在android平台上报错

01-10 19:53:43.213: D/cocos2d-x debug info(3913): this is … test
01-10 19:53:43.237: D/cocos2d-x debug info(3913): loaded = // awesome.proto
01-10 19:53:43.237: D/cocos2d-x debug info(3913): package awesomepackage;
01-10 19:53:43.237: D/cocos2d-x debug info(3913): syntax = “proto3”;
01-10 19:53:43.237: D/cocos2d-x debug info(3913):
01-10 19:53:43.237: D/cocos2d-x debug info(3913): message AwesomeMessage {
01-10 19:53:43.237: D/cocos2d-x debug info(3913): string awesome_field = 1; // becomes awesomeField
01-10 19:53:43.237: D/cocos2d-x debug info(3913): }
01-10 19:53:43.240: D/ScriptingCore.cpp(3913): ScriptingCore:: compileScript fail:buffer
01-10 19:53:44.916: D/cocos2d-x debug info(3913): this is … test
01-10 19:53:44.935: D/cocos2d-x debug info(3913): loaded = // awesome.proto
01-10 19:53:44.935: D/cocos2d-x debug info(3913): package awesomepackage;
01-10 19:53:44.935: D/cocos2d-x debug info(3913): syntax = “proto3”;
01-10 19:53:44.935: D/cocos2d-x debug info(3913):
01-10 19:53:44.935: D/cocos2d-x debug info(3913): message AwesomeMessage {
01-10 19:53:44.935: D/cocos2d-x debug info(3913): string awesome_field = 1; // becomes awesomeField
01-10 19:53:44.935: D/cocos2d-x debug info(3913): }
01-10 19:53:44.936: D/cocos2d-x debug info(3913): load protobuf= [object Object]
01-10 19:53:44.936: E/cocos js error:(3913): assets/src/project.dev.js line:7241 msg:TypeError: protobuf.parse is not a function

跪求高手指点迷津

补充一下, PB脚本如下:
// awesome.proto
package awesomepackage;
syntax = “proto3”;

message AwesomeMessage {
string awesome_field = 1; // becomes awesomeField
}

参考这两个 link 试试:

http://forum.cocos.com/t/creator-protobufjs/37081

http://forum.cocos.com/t/creator-protobuf/36961

1赞

感谢子龙山人

http://forum.cocos.com/t/creator-protobufjs/37081
这个里面的API貌似使用的是第5个版本,因为最新的版本找不到 loadProto 方法. 我用 npm install protobufjs 安装到的是6.4.6

http://forum.cocos.com/t/creator-protobuf/36961
这个找不到API说明文档哦, 不知道哪里能找到代码示例?

你可以跟原帖的作者交流一下,我也不是很熟。不过理论上,你所使用的方法应该是要能够工作的,可能是 Profobufjs 的某些写法,我们打包后识别不了。

哦哦, 谢谢! 我琢磨下这个 36961

山人, 顺便问一下cocos creator里面可以全平台(webview / simulator / android / ios )使用 websocket 和 TCP 的库是哪个啊
感觉用 creator 之后找第三方库各种晕头转向, 有没有几个固定的网站或者是地方能找需要的库啊.

Websocket 现在就是全平台支持的啊,不用找什么第三方库。 TCP 的话需要你自己去做 jsb 绑定,而 web 上面直接用 tcp 的很少吧?不知道是否可行。

creator 的 js版本上
android 和 iOS 原生打包的 websocket 好像是不支持的吧?

哦哦, 试了, 打包后是支持的… - - |||

那么我找一下TCP吧

试过了,这个没用,是新的protobufjs在安卓上好像不行

楼主解决了吗?我也碰到这个问题,好烦人。

decodeIO 出品的 protobufjs 在 creator 上是不支持的, 用子龙山人提供的那个第二个链接的zip包

使用google官方的protobuf生成文件,居然也在安卓上跑不起来,只在浏览器和模拟器上可以跑,好郁闷。

protobuf.js的高版本中,src/util/inquire/index.js,这个文内12行:

            var mod = eval("quire".replace(/^/,"re"))(moduleName); // eslint-disable-line no-eval

在安卓真机上会出现问题,如果把这行注释掉可以正常运行,是否有大神知道原因?

使用这个方案,解决了问题,还是使用google官方的方案靠谱:
https://github.com/google/protobuf/tree/master/js

恩恩, 子龙山人提的那两个方案中有一个方案是可以的啊, 记得看一下我的回复

forum.cocos.com/uploads/default/original/2X/0/0e90b3823e4520d0afa40f114b6a830ae1126c7f.zip

我是经过子龙山人的提示, 用这个方案搞定的

根源是protobufjs里面进行了尝试require,比如检查环境中是否有long模块来决定是使用哪种int64支持,就会require一下,没有require到long就用别的支持.
但creator在andoid上require失败会不让启动, 所以有这个问题.
而windows模拟器上require失败可以继续.
我觉得哪怕creator一定要求require失败就不让继续, 是不是最好也让windows模拟器和andoid表现一致?

那请问你们后来是怎么解决的呢?理论上 require 失败确实不应该启动。我也不知道为什么模拟器上反而 OK

protobuf上一共就几个尝试require.
一个buffer和两个fs,直接改成不require,置为null.
一个long,加入了dcodeIO的long.

官方的protobuf的js的版本不支持直接load .proto文件吧?
只能生成js,然后打包进游戏是吧