从前两篇文章过来,假设你已经了解了下载使用ARChon、简单分析与Chrome插件介绍

这篇文章主要是分析ARChon如何实现跨平台。

源码:https://bitbucket.org/vladikoff/archon/src

Archon 如何实现跨平台?

拉代码下来会发现几乎没有文档,核心的代码都被编译成 so 库。官方提供了几篇文章。

  • omgchrome.com ARChon article
  • Lifehacker article
  • Ars Technica article
  • Google Operating System article

这几篇都是科普如何操作的文章,看完之后知道了 ARChon 基于 Native Client 做了跨平台。

Native Client: https://developer.chrome.com/native-client

看到 Native Client 在除了Chrome-OS 的其他平台被 WebAssembly 替代。也大改能猜出为啥 ARChon 没维护了呢。: - (

什么是 Native Client ?

看了采访视频 https://www.youtube.com/watch?v=MvKEomoiKBA ,发现Native Client的工作量却是是巨大的。但是他们做完了。 ;)

翻译自:
https://developer.chrome.com/native-client/overview

Native Client是一个沙箱,用于在浏览器中高效。安全地运行已编译的C和C ++代码,与用户的操作系统无关。Portable Native Client扩展了该技术的架构独立性。允许开发人员编译其代码一次,以便在任何网站和任何具有提前(AOT)转换的架构上运行。简而言之,Native Client将本机代码的性能和低级控制带到现代Web浏览器。而不会牺牲Web的安全性和可移植性

Native Client有两种版本。

  • Portable Native Client(PNaCl):发音为’pinnacle’,PNaCl运行单个便携式(pexe)可执行文件,并且在大多数Chrome实现中都可用。 Chrome内置的翻译器将pexe转换为客户端硬件的本机代码。在执行任何代码之前,而不是在执行代码时,将翻译整个模块。 PNaCl模块可以从任何Web服务器托管。

  • Native Client(NaCl):也称为传统或非Portable Native Client,NaCl运行依赖于架构的(nexe)模块,这些模块打包到应用程序中。在运行时,浏览器根据客户端的体系结构决定加载哪个nexe通过Chrome Web Store(CWS)安装的Apps和Extensions可以使用NaCl模块而无需其他提示。也可以在开发期间从chrome://扩展或命令行安装NaCl应用程序,但是,这不是推荐的分发机制。

Native Client的工作原理

Native Client是一组相关软件组件的总称,用于开发 C/C++ 应用程序并在Web上安全地运行它们。 在较高级别,Native Client包括:

  • Toolchains (工具链)
    将C / C ++代码转换为可移植Native Client模块或Native Client模块的开发工具(编译器,链接器等)的集合。
  • Runtime components (运行时组件)
    嵌入在浏览器或其他主机平台中的组件,可以安全有效地执行Native Client模块。

如何编写 Native Client的程序?

以下是step by step的教程。有如下目的:

  • 如何开始参与开发?
  • 示范如何写 C++ 代码?;
  • 如何用 Toolchains 编译输出?;
  • C++如何在 Native Client Runtime 中执行(chrome浏览器)?;

翻译来自:
https://developer.chrome.com/native-client/devguide/tutorial/tutorial-part1

步骤1:下载并安装Native Client SDK
# wget https://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip
# 官方的镜像证书过期了,直接从github上拉也可以
git clone https://github.com/Kagami/nacl_sdk.gitcd nacl_sdk
./naclsdk list
./naclsdk update

update 可能需要翻墙

第2步:启动本地服务器

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

 cd pepper _ $(VERSION)/ getting_startedmake serve

SDK可能包含多个“捆绑”,每个Chrome / Pepper版本一个(请参阅版本控制信息 )。 在上面的示例调用中, pepper_$(VERSION)指的是您要使用的特定版本。 例如, pepper_37 。 如果您不知道需要哪个版本,请使用naclsdk list命令标记(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 :用于从hello_tutorial.cc中的C ++代码构建pexe (可移植可执行文件)的编译命令。
现在看一下这些文件是个好主意 - 它们包含大量有助于解释其结构和内容的注释。 有关典型Native Client应用程序结构的更多详细信息,请参阅应用程序结构 。

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

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

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

 cd pepper _ $(VERSION)/ getting_started / part1make

由于样本位于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 moduleHelloTutorialModule.postMessage('hello');
}
步骤7:在Native Client模块中实现消息处理程序

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

实现模块实例的HandleMessage()成员函数。
使用PostMessage()成员函数将消息从模块发送到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. 查找以下行:

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模块并再次运行该应用程序

通过再次运行make命令编译Native Client模块。
通过运行make server启动SDK Web make server。
通过在Chrome中重新加载http://localhost:5103/part1重新运行该应用程序。
Chrome加载Native Client模块后,您应该会看到从模块发送的消息。

步骤9:查看完整文档
cd examples
make serve

http://localhost:5103

ARChon 分析之三:Native Client相关推荐

  1. 教程之三、Chrome Dev Summit 2014 - Native Client Codelabs

    原文链接:https://developer.chrome.com/native-client/cds2014 十字路口 为了您的编码乐趣,我们有两个codelabs.根据您的兴趣和以往经验,查看其中 ...

  2. ARChon 分析之四:ARC的下载与编译

    从前三篇文章过来,假设你已经看了 下载使用ARChon.简单分析与Chrome插件介绍.Native Client. 这篇文章主要是描述如何下载与编译ARC. 实际上是有两个ARC仓库: chromi ...

  3. Chrome Native Client 原理

    Native Client:A Sandbox for Portable, Untrusted x86 Native Code 系统架构 一个NaCl应用程序由许多可信和不可信NaCl模块组成,每个模 ...

  4. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分 ...

  5. Google Native Client介紹

    以下出自baidu百科 NativeClient:Google的一个新产品,目前出于试验阶段,它能够帮助网络开发者编写更强大的Web应用,使得网络应用可以直接在本地操作系统上运行,不需通过浏览器.Go ...

  6. SQL Server native client与sqlcmd单独安装

    背景 我有一台虚拟机,想要连接sql server,但是又不想安装sql server怎么办. 方案 sql server有专门的访问客户端叫做sql server native client,然后还 ...

  7. 如何通过编程方式添加Native Client服务器别名

    之前我有一篇博客讲到了Native Client中添加服务器别名的问题.请参考下面的链接(讨论服务器别名的内容在该链接文章的底部) http://www.cnblogs.com/chenxizhang ...

  8. chrome Native Client 让你可以使用 C 以及 C++ 语言开发 Web 应用

    Native Client 让你可以使用 C 以及 C++ 语言开发 Web 应用 2011年8月22日发表评论 新浪微博 网易微博 腾讯微博 开心网 人人网 豆瓣 Google 的产品经理 Chri ...

  9. 基于Native Client的编程框架

    上面是一个浏览器的架构图,JS引擎+渲染引擎+外壳Shell+内核 4部分构成了浏览器的主体,传统的插件(上图左部)通过NPAPI与浏览器通信,Native Client(上图右部)通过PPAPI与浏 ...

最新文章

  1. c++派生类的访问控制
  2. evernote100个做笔记的好方法
  3. dockerfile mysql例子_简单的Dockerfile书写(实例!!!)
  4. if和case用法比较
  5. 求第i个小的元素 时间复杂度O(n)
  6. curl命令php,php生成curl命令行的方法
  7. celery cluser redis_celery结合redis 使用
  8. java随机数_Java随机
  9. hive设置为本地模式,从而避免MapReduce
  10. 运放专题:电压比较器
  11. POI 实现Word替换书签
  12. 武汉工程大学计算机学院吴云韬,周华兵-武汉工程大学计算机科学与工程学院...
  13. eclipse更改J2EE对应的Web版本
  14. 【IoT】CC2541 BLE 4.0 底层协议栈广播连接过程解析
  15. Notepad++ 安装XML Tools插件格式化XML文件
  16. vue 图片 404 显示默认图片
  17. UART串口发送卡在UART_WaitOnFlagUntilTimeout()函数出不来
  18. 初始化MYSQL时的几个问题
  19. java毕业设计-篮球资讯网站-源码+lw文档+mybatis+系统+mysql数据库+调试
  20. 一文梳理2020年大热的对比学习模型

热门文章

  1. excel转pdf在线转换器
  2. seq2seq文本翻译的例子
  3. 家里没网络怎么自学html,家里没网了怎么办?不要慌,学会这两招自己就能解决...
  4. 博士申请 | 香港浸会大学杨任驰老师招收大数据技术方向全奖博士生
  5. java打印一个正方形(实心)方法不唯一
  6. 3.15求解“鸡兔同笼问题”:鸡和兔在一个笼子里,共有腿100条,头40个,问鸡兔各有几只?
  7. 2019盖茨年信,以及30个关于比尔盖茨的真相
  8. 杀死比尔盖茨:美国有31万脑子被撞坏的人,认为他创造了新冠病毒
  9. 场景分析原则-5W1H1E
  10. 开源夏令营《基于HackRF开发GPS信号仿真模拟器》工作总结(一)