写在前面 :
最近遇到一个性能问题,浏览器需要上传大量图片至存储平台,而存储平台只提供了 C++ 的动态库接口.因此当前的方案是前端上传至后台服务器,服务器再上传到存储平台,效率低下得令人发指.
如果浏览器可以直接调用 C++ 就好了
于是注意到 Chrome 的 PPAPI
下面简单介绍一下,如何入门 PNaCl:
(主要资料均来自于官方文档)
1. 下载和安装 Native Client SDK
下载链接: https://developer.chrome.com/native-client/sdk/download
下载后是一个 nacl_sdk.zip 的压缩包,进行解压.
用超级管理员身份运行 cmd,进入 nacl_sdk 目录.
执行 naclsdk.bat update 命令.(需要翻墙)
等待半小时左右后,你会发现多了一个 peppepper_49(49 是版本号)的文件夹.就成功了.
2. 设置 chrome 禁止 cache
F12 打开开发者工具,通过右上角进入 setting,在 preference 中 network 中勾选 Disable cache (while DevTools is open)
3. 修改 JS 代码
进入 getting_started/part1,编辑 index.html,
重写 moduleDidLoad 函数如下:
function moduleDidLoad() {
HelloTutorialModule = document.getElementById('hello_tutorial');
updateStatus('SUCCESS');
// Send a message to the Native Client module
HelloTutorialModule.postMessage('hello');
}
4. 修改 C++ 代码
编辑 hello_tutorial.cc 文件,
在 include 后添加如下代码:
namespace {
// The expected string sent by the browser.
const char* const kHelloString = "hello";
// The string sent back to the browser upon receipt of a message
// containing "hello".
const char* const kReplyString = "hello from NaCl";
} // namespace
重写 HandleMessage 函数如下:
virtual void HandleMessage(const pp: :Var & var_message) {
if (!var_message.is_string()) return;
std: :string message = var_message.AsString();
pp: :Var var_reply;
if (message == kHelloString) {
var_reply = pp: :Var(kReplyString);
PostMessage(var_reply);
}
}
5. 启动一个本地服务
同样运行 cmd,执行以下两句:
$ cd pepper_$(VERSION)/getting_started
$ make serve
6. 编译代码
同样运行 cmd,执行以下两句:
$ cd pepper_$(VERSION)/getting_started/part1
$ make
7. 运行
打开 chrome,进入 http://localhost:5103/part1
此时如果发现,从 Status LOADING 变成 Status success ,并且弹出 "hello from NaCl",
说明调用 C++ 已经成功了.
来源: http://www.jianshu.com/p/7ee63ec5d2d2