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/