CEF应用浅析
目录
1 、 CEF 简介
a) CEF 是一款基于 Chromium 浏览器的嵌入式框架,提供了基本的浏览器功能。包括自定义插件、各种协议、 Javascript 对象访问和扩展。一些可选的功能包括,资源加载、导航、上下文目录、打印等;值得一提的是,它对 HTML5 的支持和性能与 Google Chrome 浏览器同样优秀。
b) CEF 包括 CEF1 、 CEF2 和 CEF3 三个大版本。其中, CEF1 仅支持单线程, CEF2 已经被废弃,所以现在基本是使用 CEF3 进行开发。
c) 如果希望了解更多相关内容,可以访问它的网站
https://bitbucket.org/chromiumembedded/cef/wiki/Home
d) 由于 CEF 是基于 Chromium 内核的,所以 CEF 支持的操作系统也会有限制。参考下表 1
Branch Date |
Release Branch |
Chromium Version |
CEF1 |
CEF3 |
Windows Build Requirements |
Mac OS X Build Requirements |
Linux Build Requirements |
Dec 2011 |
17 |
Yes |
No |
WinXP+, VS2008, Win7 SDK |
OS X 10.6-10.7, 10.5+ SDK, Xcode 3.2.6 |
Ubuntu 10.04+, Debian Squeeze+ |
|
Feb 2012 |
18 |
Yes |
No |
WinXP+, VS2008, Win7 SDK |
OS X 10.6-10.7, 10.5+ SDK, Xcode 3.2.6-4.x |
Ubuntu 10.04+, Debian Squeeze+ |
|
Apr 2012 |
19 |
Yes |
No |
WinXP+, VS2008, Win7 SDK |
OS X 10.6-10.7, 10.5+ SDK, Xcode 3.2.6-4.x |
Ubuntu 10.04+, Debian Squeeze+ |
|
Aug 2012 |
21 |
Yes |
Yes |
WinXP+, VS2010, Win7 SDK |
OS X 10.6-10.7, 10.5+ SDK, Xcode 3.2.6-4.x |
Ubuntu 12.04+, Debian Squeeze+ |
|
Oct 2012 |
23 |
Yes |
Yes |
WinXP+, VS2010, Win7 SDK |
OS X 10.6-10.8, 10.6+ SDK, Xcode 3.2.6-4.x |
Ubuntu 12.04+, Debian Squeeze+ |
|
Jan 2013 |
25 |
Yes |
Yes |
WinXP+, VS2010, Win8 SDK, Ninja (optional) |
OS X 10.6-10.8, Xcode 3.2.6-4.x, Ninja (optional) |
Ubuntu 12.04+, Debian Squeeze+, Ninja (optional) |
|
Apr 2013 |
27 |
Yes |
Yes |
WinXP+, VS2010, Win8 SDK, Ninja (optional) |
OS X 10.6-10.8, 10.6+ SDK, Xcode 3.2.6-4.x, Ninja (optional) |
Ubuntu 12.04+, Debian Squeeze+, Ninja (optional) |
|
Jul 2013 |
29 |
No |
Yes |
WinXP+, VS2010-2012, Win8 SDK, Ninja (optional) |
OS X 10.6-10.8, 10.6+ SDK, Xcode 3.2.6-4.x, Ninja (optional) |
Ubuntu 12.04+, Debian Squeeze+, Ninja |
|
Oct 2013 |
31 |
No |
Yes |
WinXP+, VS2010-2012, Win8 SDK, Ninja (optional) |
OS X 10.6-10.9, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
|
Jan 2014 |
33 |
No |
Yes |
WinXP+, VS2010-2013, Win8 SDK, Ninja |
OS X 10.6-10.9, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
|
Apr 2014 |
35 |
No |
Yes |
WinXP+, VS2013, Win8 SDK, Ninja |
OS X 10.6-10.9, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
|
Aug 2014 |
37 |
No |
Yes |
WinXP+, VS2013, Win8 SDK, Ninja |
OS X 10.6-10.9, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
|
Oct 2014 |
39 |
No |
Yes |
WinXP+, VS2013u4, Win8.1 SDK, Ninja |
OS X 10.6-10.9, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
|
Jan 2015 |
41 |
No |
Yes |
WinXP+, VS2013u4, Win8.1 SDK, Ninja |
OS X 10.6-10.10, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja, 64-bit only |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
|
Apr 2015 |
43 |
No |
Yes |
WinXP+, VS2013u4, Win8.1 SDK, Ninja |
OS X 10.6-10.10, 10.6+ SDK, Xcode 3.2.6-5.x, Ninja, 64-bit only |
Ubuntu 12.04+, Debian Wheezy+, Ninja |
表 1 cef 支持系统对比
e) 如果需要下载 CEF 可以到如下链接中下载
CEF 相关下载
http://www.magpcss.net/cef_downloads/index.php
CEF3 相关下载
https://cefbuilds.com/#branch_trunk
f) 尝试使用的话,可以在下载包中,找到 cefsimple.exe 和 cefclient.exe ,通过使用可以了解更多的相关特性。
2 、 JCEF 简介
a) JCEF 项目对 CEF 进行了一层 Java 封装。使用 JNI 调用 CEF 的功能。
3 、 CEF 编译
a) 由于目前需要 Windows 下的 cef ,我这里只说一下 Windows 下的编译方式。
b) 首先,你的机器必须安装了 Visual Studio 2013 Update4
c) 然后,需要安装 depot_tools
d) 还需要安装 Windows 8.1 SDK
e) 安装 GYP 也是必须的
f) 由于我这里只是使用了 Visual Studio 进行编译,其他帮助可以参考
http://dev.chromium.org/developers/how-tos
g) 设置环境变量, set GYP_GENERATORS=msvs
h) 进入加压后的文件
i) 主要是使用 GYP 生成 Visual Studio 需要的项目配置文件 .sln
gclient runhooks
j) 然后使用 Visual Studio 打开,生成 cefclient 或 cefsimple 就可以了
k) 具体的过程参考
https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding.md
l) CEF 的使用方法参考
https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage.md
4 、 JCEF 编译
a) 编译 JCEF 可以在 Windows, Linux 和 Mac OS X for 64-bit Oracle 7 Java 目标上, 32 位没有测试,这里我测试了 Windows 7 ,可以编译通过,使用的是 "1.7.0_25"
b) GYP 、 Visual Studio 2013 、 depot_tools 是必须的, GYP 和 depot_tools 的路径配置到 PATH 中
c) 配置 gclient
gclient config --unmanaged --name=src
https://bitbucket.org/chromiumembedded/java-cef.git
d) 下载 JCEF 和第三方依赖
gclient sync --jobs 8 --force --nohooks
e) 在 src/third_party/cef/README.jcef 中,看当前的 JCEF 支持什么 CEF 版本,不要看错, http://magpcss.org/ceforum/ 里的帖子好多都是因为这个造成的
f) 然后去 http://cefbuilds.com 里下载,这里我使用的 win32 ,下载的是 win32 的一个版本,放到 src/third_party/cef/win32 下
g) 在 src 下使用 gclient runhooks 生成 .sln 文件,用 Visual Studio 编译生成目标文件,目标可以是 Debug 和 Release 的,生成的目录也不相同
h) 接着在当前 shell 中定义变量
set GYP_GENERATORS=msvs
set GYP_DEFINES=jcef_platform=win32 jdk_directory="C:\JDK7_25"
i) 在 src/tools 中, compile.bat win32 编译,会在 src/out/win32 下生成
j) 使用 src/tools/run.bat win32 Debug detailed 运行
k) 如果路径不对,看下脚本吧
l) 最后,使用 src/tools/make_distrib.bat win32 打包,在 src/binary_distrib/win32 下可以找到
5 、 JCEF 使用
a) 基于 JCEF 开发,需要使用到 CEF 生成的 libcef.dll 和 jcef.dll 等文件,还需要 jcef.jar 包
b) 可以参考 tests.detailed.MainFrame 和 tests.simple.MainFrame
c) 由于我这里的主要需求是使用浏览器加载 html 字符串,字符串中包括 js 、 css 和图片等内容,直接使用 loadUrl 和 loadString 都不能达到要求
d) loadUrl 只能加载 url 页面, loadString 不能解析 html 字符串中的文件元素
e) 这里参考了 tests.detailed.MainFrame 的 ClientSchemeHandler 类
f) 具体步骤如下
- CefApp.addAppHandler() 添加一个 CefAppHandlerAdapter 的子类
- 在 CefAppHandlerAdapter 的子类的 onRegisterCustomSchemes 方法中,使用 registrar.addCustomScheme 添加一个自定义的 scheme 名
- 在 CefAppHandlerAdapter 的子类的 onContextInitialized 方法中,使用 cefApp.registerSchemeHandlerFactory ,把自定义的 sheme 和 domain 名称与自定义的 CefSchemeHandlerFactory 映射
- 每次 CefSchemeHandlerFactory.create 时,返回一个自定义的 CefResourceHandlerAdapter
- 可以通过改变 processRequest 中的 html 信息来加载 html 字符串
- Html 中包含的文件元素,可以手动加载如 html 中,因为 html 解析是先解析 html 字符串,然后对于其中的文件信息在进行请求
g) 但 JCEF 对于 SWT 的支持不太好,可以参考 Javacef ,这个是一个国人写的,不过,我测试了一下,在我机器上,有些不太稳定,没有深究,可以学习和借鉴,
https://code.google.com/p/javacef/