教程之一、第1部分:简单的PNaCl Web应用程序

原文链接:https://developer.chrome.com/native-client/devguide/tutorial/tutorial-part1

C ++教程:入门(第1部分)

概要

本教程介绍如何使用Portable Native Client(PNaCl)构建和运行Web应用程序。这是一个客户端应用程序,它使用HTML,JavaScript和用C ++编写的Native Client模块。PNaCl工具链用于直接从网页运行Native Client模块。

建议您在完成本教程之前阅读Native Client技术概述

本教程中的应用程序的作用

本教程中的应用程序显示了如何在网页中加载Native Client模块,以及如何在JavaScript和Native Client模块之间发送消息。在这个简单的应用程序中,JavaScript将'hello'消息发送到Native Client模块。当Native Client模块收到消息时,它会检查消息是否等于字符串'hello'。如果是,则Native Client模块返回一条消息说明'hello from NaCl'。JavaScript警报面板显示从Native Client模块收到的消息。

JavaScript和Native Client模块之间的通信

Native Client编程模型支持JavaScript和Native Client模块之间的双向通信。双方都可以发起和回复消息。在所有情况下,通信都是异步的:调用者(JavaScript或Native Client模块)发送消息,但调用者不等待或甚至不期望响应。此行为类似于Web上的客户端/服务器通信,客户端将消息发送到服务器并立即返回。Native Client消息传递系统是Pepper API的一部分,在Developer's Guide:Messaging System中有详细描述 。它也类似于Web worker与JavaScript中的主文档交互的方式。

步骤1:下载并安装Native Client SDK

按照“ 下载”页面上的说明下载并安装Native Client SDK。

第2步:启动本地服务器

为了模拟生产环境,SDK提供了一个简单的Web服务器,可用于为应用程序提供服务localhost。调用方便的Makefile规则serve是调用它的最简单方法:

$ cd pepper_$(VERSION)/getting_started
$ make serve

SDK可能包含多个“捆绑”,每个Chrome/Pepper版本一个(请参阅 版本控制信息)。在上面的示例调用中, pepper_$(VERSION)指的是您要使用的特定版本。例如,pepper_37。如果您不知道所需的版本,请使用命令标记(stable)的版本naclsdk list。有关更多详细信息,请参阅 下载Native Client SDK

如果未指定端口号,则服务器默认为端口5103,可以在以下位置访问http://localhost:5103

任何服务器都可用于开发目的。随SDK提供的只是一个方便,而不是一个要求。

第3步:设置Chrome浏览器

默认情况下,Chrome中会启用PNaCl。我们建议您使用与用于构建Native Client模块的SDK包相同或更新的Chrome版本。较旧的PNaCl模块将始终与较新版本的Chrome一起使用,但反之亦然。

要查找Chrome版本,请输入about:chrome地址栏。

为了获得更好的开发体验,还建议您停用Chrome缓存。Chrome积极地缓存资源; 禁用缓存有助于确保在开发期间加载最新版本的Native Client模块。

  • 点击菜单图标菜单图标并选择,打开Chrome的开发者工具Tools > Developer tools
  • 点击齿轮图标Chrome窗口右下角的齿轮图标。
  • 在“常规”设置下,选中“禁用缓存(DevTools打开时)”旁边的框。
  • 在开发Native Client应用程序时,保持“开发人员工具”窗

第4步:本教程的存根代码

该教程的存根代码可在SDK中找到 pepper_$(VERSION)/getting_started/part1。它包含以下文件:

  • index.html:包含页面的HTML布局以及与Native Client模块交互的JavaScript代码。

    Native Client模块包含在页面中,其中包含<embed>指向清单文件的标记。

  • hello_tutorial.nmf:清单文件,用于将HTML指向Native Client模块,并可选择向作为Chrome浏览器一部分的PNaCl转换程序提供其他命令。
  • hello_tutorial.cc:简单Native Client模块的C ++代码。
  • Makefile:用于从C ++代码构建pexe(可移植可执行文件)的编译命令hello_tutorial.cc

现在看一下这些文件是个好主意 - 它们包含大量有助于解释其结构和内容的注释。有关典型Native Client应用程序结构的更多详细信息,请参阅 应用程序结构

存根码有意非常小。除正确初始化自身外,C ++代码不执行任何操作。JavaScript代码等待Native Client模块加载并相应地更改网页上的状态文本。

步骤5:编译Native Client模块并运行存根应用程序

要编译Native Client模块,请运行make

$ cd pepper_$(VERSION)/getting_started/part1
$ make

由于样本位于SDK树中,因此Makefile知道如何自动查找PNaCl工具链并使用它来构建模块。如果要在NaCl SDK树之外构建应用程序,则应设置 $NACL_SDK_ROOT环境变量。有关详细信息,请参阅构建Native Client模块

假设本地服务器是根据步骤2中的说明启动的 ,现在可以通过将Chrome指向来加载示例http://localhost:5103/part1。Chrome应成​​功加载Native Client模块,状态文本应从“LOADING ...”更改为“SUCCESS”。如果遇到问题,请查看下面的“ 疑难解答”部分

步骤6:修改JavaScript代码以将消息发送到Native Client模块

在此步骤中,您将修改网页(index.html)以在页面加载模块后向Native Client模块发送消息。

查找JavaScript函数moduleDidLoad(),并添加新代码以向模块发送“hello”消息。新功能应如下所示:

function moduleDidLoad() {
  HelloTutorialModule = document.getElementById('hello_tutorial');
  updateStatus('SUCCESS');
  // Send a message to the Native Client module
  HelloTutorialModule.postMessage('hello');
}

步骤7:在Native Client模块中实现消息处理程序

在此步骤中,您将修改Native Client模块(hello_tutorial.cc)以响应从应用程序中的JavaScript代码接收的消息。具体来说,你将:

  • 实现HandleMessage()模块实例的成员函数。
  • 使用PostMessage()member函数将消息从模块发送到JavaScript代码。

首先,添加代码以定义Native Client模块使用的变量(您期望从JavaScript接收的'hello'字符串以及您希望作为响应返回到JavaScript的回复字符串)。在文件中 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()成员函数来检查 kHelloString并返回kReplyString.查找以下行:

// TODO(sdk_user): 1. Make this function handle the incoming message.

使用代码填充成员函数,如下所示:

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);
  }
}

有关pp :: Instance.HandleMessage 和pp :: Instance.PostMessage 成员函数的其他信息,请参阅Pepper API文档。

步骤8:编译Native Client模块并再次运行该应用程序

  1. 通过make再次运行该命令来编译Native Client模块。

  2. 通过运行启动SDK Web服务器make server

  3. 通过http://localhost:5103/part1在Chrome中重新加载来重新运行该应用程序。

    Chrome加载Native Client模块后,您应该会看到从模块发送的消息。

故障排除

如果您的应用程序未运行,请参阅上面的步骤3以验证您是否正确设置了环境,包括Chrome浏览器和本地服务器。确保您运行的是正确版本的Chrome,该版本也大于或等于您正在使用的SDK捆绑包版本。

另一个有用的调试工具是Chrome JavaScript控制台(可通过ToolsChrome中的 菜单获得)。检查它是否有关于出了什么问题的线索。例如,如果有消息说“NaCl模块崩溃”,则Native Client模块可能存在错误; 可能需要调试

有关文档中的疑难解答的更多信息:

下一步

  • 有关如何构建Native Client模块的信息,请参阅Developer's Guide中的Application Structure部分。
  • 有关如何使用Pepper API的详细信息,请查看C ++参考
  • 浏览SDK示例的源代码(在examples 目录中)以了解编写Native Client应用程序和使用Pepper API的其他技术。
  • 有关如何构建,运行和调试Native Client应用程序的信息,请参阅“ 构建运行调试”页面
  • 检查Webports项目以查看已移植的库以用于Native Client。如果您将开源库移植到自己使用的位置,我们建议将其添加到Webports(请参阅如何将代码检入Webports)。

CC-By 3.0许可下提供的内容

posted @ 2018-07-19 16:23  SunkingYang  阅读(355)  评论(0编辑  收藏  举报