在Javascript中使用protobuf與c++進行通信


環境:Win7_64旗艦版,VS2013

最近在研究Webkit,已經編譯成功,接下來就是Javascript與c++如何傳輸數據,立刻就想到了protobuf,但是谷歌不支持Javascript,百度了很久,終於找到了

這篇文章:http://blog.csdn.net/xnn2s/article/details/8580917


一、首先下載protobuf,進行編譯生成libprotobuf.dll、libprotoc.dll、protoc.exe文件,網上有很多非常詳細的教程,這里不多說。


二、下載protobuf-plugin-closure,可以到github上進行下載,我下載的是protobuf-plugin-closure-rethinkdb。


三、接下來就是編譯插件了(詳見README文件)

1、將編譯protouf后生成的libprotobuf.dll、libprotoc.dll、protoc.exe文件拷貝到protobuf-plugin-closure-rethinkdb文件夾下。

2、然后將protobuf庫下的四個文件拷貝到protobuf-plugin-closure-rethinkdb文件夾下,這四個文件分別是

plugin.pb.h
plugin.pb.cc
plugin.h
plugin.cc

3、使用protoc將javascript_package.proto、int64_encoding.proto生成如下文件

int64_encoding.pb.h
int64_encoding.pb.cc
javascript_package.pb.h
javascript_package.pb.cc


4、使用VS2013創建控制台應用程序,項目名為"protoc-gen-js"

將以下文件加入到項目中

js/code_generator.h
js/code_generator.cc
js/int64_encoding.pb.h
js/int64_encoding.pb.cc
js/javascript_package.pb.h
js/javascript_package.pb.cc
js/protoc_gen_js.cc

plugin.h
plugin.cc
plugin.pb.h
plugin.pb.cc

編譯"protoc-gen-js""項目生成protoc-gen-js.exe文件


5、使用VS2013創建控制台應用程序"protoc-gen-ccjs"

將以下文件加入到項目中

js/int64_encoding.pb.h
js/int64_encoding.pb.cc
js/javascript_package.pb.h
js/javascript_package.pb.cc

plugin.h
plugin.cc
plugin.pb.h
plugin.pb.cc

ccjs/code_generator.h
ccjs/code_generator.cc
ccjs/protoc_gen_ccjs.cc

編譯"protoc-gen-ccjs""項目生成protoc-gen-ccjs.exe文件

ccjs/code_generator.cc文件有一個錯誤,需要在ccjs/code_generator.h中加入宏

#if _MSC_VER
#define snprintf _snprintf
#endif


6、使用插件從proto文件生成.js和.cc文件,這樣Javascript和c++就可以使用了

protoc的命令行參數非常坑爹,不過幸好有源碼,可以看到里面的一些規則

打開cmd,進入到protobuf-plugin-closure-rethinkdb文件夾下(此文件夾下有protoc.exe)

protoc --plugin=protoc-gen-js=bin/protoc-gen-js.exe --plugin=protoc-gen-ccjs=bin/protoc-gen-ccjs.exe -I E:\protobuf-plugin-closure-rethinkdb\ -I E:\protobuf-2.5.0\src\ --js_out=.\out\ --cpp_out=.\out\ -- ccjs_out=.\out\E:\Desktop\OpenSource\protobuf-plugin-closure-rethinkdb\protobuf-plugin-closure-rethinkdb\js\test.proto

--plugin=protoc-gen-js=bin/protoc-gen-js.exe 表示 --plugin=插件名稱=插件路徑

-I E:\protobuf-plugin-closure-rethinkdb\ -I E:\protobuf-2.5.0\src\表示proto文件的路徑

--js_out=.\out\ 表示在當前目錄下的out文件夾下生成js文件

--cpp_out=.\out\  表示在當前目錄下的out文件夾下生成.h和.cc文件

注意:

1、插件的名稱格式必須是protoc-gen-XX,且與--XX_out對應,否則生成失敗

2、--cpp_out=.\out --ccjs_out=.\out順序不能打亂,否則將提示"Tried to insert into file that doesn't exist."錯誤(跟蹤發現protoc-gen-ccjs.exe插件只是在原有.h和.cc文件中插入了幾個函數,這個錯誤用了我幾個小時^^)

3、使用插件生成的.cc文件后,會有很多錯誤

用於c++不支持直接輸入二進制數,將0b開始的數字替換成十六進制數據(char)0x。

使用NextCppCharToJsonEscapedBuffer函數有個問題,將

if (snprintf(json_escaped_buf,
               sizeof(json_escaped_buf),
               "\\u%04lx",
               val) != 6) {
    RTN_FALSE;
  }

替換為

if (snprintf(json_escaped_buf,
               7,
               "\\u%04lx",
               val) != 6) {
    RTN_FALSE;
  }

因為在c++里面,數組作為形參時和指針沒什么區別,使用sizeof不能計算數組的大小。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM