首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Cordova应用程序中实现ProtobufJS的错误

在Cordova应用程序中实现ProtobufJS的错误
EN

Stack Overflow用户
提问于 2015-09-20 15:48:44
回答 1查看 491关注 0票数 1

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

方法1:使用“pbjs”在proto文件之外创建一个JS对象.

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

代码语言:javascript
复制
<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中定义的。ClientMessage.js是从proto文件派生出来的JS类文件。基于此链接,我应该能够通过proto中定义的包名引用类,如下所示:

代码语言:javascript
复制
function TestProtoObject()
{
    var blah = new ForeverRPG.ClientMessage();
}

或者通过_root,我假设如下:

代码语言:javascript
复制
function TestProtoObject()
{
    var blah = new _root.ClientMessage();
}

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

代码语言:javascript
复制
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以创建类:使用与上面相同的设置,除非没有ClientMesssage.js,我在common.js中添加了一个方法,执行以下操作:

代码语言:javascript
复制
var builder = ProtoBuf.newBuilder();
builder.define("ForeverRPG");
builder.create([
    {
        "package": "ForeverRPG",
        "messages": [
            {
        <JSON here: removed for brevity>
            }
        ]
    }
]);

ForeverRPG = builder.build("ForeverRPG");

但是,这给了我一个错误:

代码语言:javascript
复制
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).

我将在评论中提供整个项目链接,因此由于我的newb状态,我不会让我的帖子中有两个以上的链接。

谢谢你的帮助,

双声码器

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-03 07:12:41

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

代码语言:javascript
复制
var msg = new _root.ForeverRPG.ClientMessage();
/* Theese are wrong:
var blah = new ForeverRPG.ClientMessage();
var blah = new _root.ClientMessage();
*/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32681257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档