在Cordova应用中实现ProtobufJS的错误



我正在写一个Cordova应用程序,目前在android模拟器(x86镜像)上测试它。我试图使用ProtobufJS来实现客户端应用程序和服务器之间的协议缓冲区。我已经使用javascript解析器验证了所有JS文件在语法上是正确的。有几种方法可以实现ProtobufJS。我已经解决的两种方法都在android日志中创建错误。

方法1:使用'pbjs'从proto文件中创建一个JS类对象

在我的index.html文件中,我有以下脚本标签:

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/Long.js"></script>
<script type="text/javascript" src="js/ByteBuffer.js"></script>
<script type="text/javascript" src="js/ProtoBuf.js"></script>
<script type="text/javascript" src="js/ClientMessage.js"></script>
<script type="text/javascript" src="js/common.js"></script>
<script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="js/index.js"></script>

在我的index.js文件onDeviceReady之后,我调用TestProtoObject(),这是在common.js中定义的。JS是生成的JS类文件派生自我的proto文件。基于这个链接,我应该能够通过在原型中定义的包名引用类,如下所示:

function TestProtoObject()
{
    var blah = new ForeverRPG.ClientMessage();
}

或者通过_root,我假设像这样:

function TestProtoObject()
{
    var blah = new _root.ClientMessage();
}

然而,这给了我以下错误:

I/chromium( 2114): [INFO:CONSOLE(169)] "Uncaught ReferenceError: Long is not defined", source: file:///android_asset/www/js/ByteBuffer.js (169)
I/chromium( 2114): [INFO:CONSOLE(1)] "Uncaught TypeError: Cannot read property 'newBuilder' of undefined", source: file:///android_asset/www/js/ClientMessage.js (1)
...
I/chromium( 2114): [INFO:CONSOLE(64)] "Received Event: deviceready", source: file:///android_asset/www/js/index.js (64)
I/chromium( 2114): [INFO:CONSOLE(64)] "Uncaught ReferenceError: ForeverRPG is not defined", source: file:///android_asset/www/js/common.js (64)

"Long"是由Long.js定义的,但根据dcodeIO,它不需要ByteBuffer(这是ProtobufJS所需要的),但是,如果我删除文件,我会在ByteBuffer.js中得到未定义的错误。最后一个"未定义"错误是因为ClientMessage.js无法解析我猜。

方法2:使用'pbjs'创建JSON,我在运行时读取创建类:使用与上面相同的设置,除了没有clientmessage .js,我在common.js中添加了一个方法,该方法执行以下操作:

var builder = ProtoBuf.newBuilder();
builder.define("ForeverRPG");
builder.create([
    {
        "package": "ForeverRPG",
        "messages": [
            {
        <JSON here: removed for brevity>
            }
        ]
    }
]);
ForeverRPG = builder.build("ForeverRPG");

然而,这给了我这个错误:

I/chromium( 2357): [INFO:CONSOLE(64)] "Received Event: deviceready", source: file:///android_asset/www/js/index.js (64)
I/chromium( 2357): [INFO:CONSOLE(364)] "Uncaught TypeError: undefined is not a function", source: file:///android_asset/www/js/ProtoBuf.js (364).

我将在评论中提供整个项目的链接,所以不会让我在我的帖子中有两个以上的链接,因为我是新手。

谢谢你的帮助,

Dustycoder

@dustycoder你在.proto文件中定义了package ForeverRPG;,所以,假设你在编译你的protobuf时使用-t=js,你应该写:

var msg = new _root.ForeverRPG.ClientMessage();
/* Theese are wrong:
var blah = new ForeverRPG.ClientMessage();
var blah = new _root.ClientMessage();
*/

最新更新