CEF应用浅析
一、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支持的操作系统也会有限制。参考下表
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 |
e) 如果需要下载CEF可以到如下链接中下载
CEF相关下载
http://www.magpcss.net/cef_downloads/index.php
CEF3相关下载
https://cefbuilds.com/#branch_trunk
f) 尝试使用的话,可以在下载包中,找到cefsimple.exe和cefclient.exe,通过使用可以了解更多的相关特性。
二、JCEF简介
a) JCEF项目对CEF进行了一层Java封装。使用JNI调用CEF的功能。
三、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
四、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下可以找到
五、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) 具体步骤如下
i. CefApp.addAppHandler()添加一个CefAppHandlerAdapter的子类
ii. 在CefAppHandlerAdapter的子类的onRegisterCustomSchemes方法中,使用registrar.addCustomScheme添加一个自定义的scheme名
iii. 在CefAppHandlerAdapter的子类的onContextInitialized方法中,使用cefApp.registerSchemeHandlerFactory,把自定义的sheme和domain名称与自定义的CefSchemeHandlerFactory映射
iv. 每次CefSchemeHandlerFactory.create时,返回一个自定义的CefResourceHandlerAdapter
v. 可以通过改变processRequest中的html信息来加载html字符串
vi. Html中包含的文件元素,可以手动加载如html中,因为html解析是先解析html字符串,然后对于其中的文件信息在进行请求
g) 但JCEF对于SWT的支持不太好,可以参考Javacef,这个是一个国人写的,不过,我测试了一下,在我机器上,有些不太稳定,没有深究,可以学习和借鉴,
https://code.google.com/p/javacef/