解析S60 Webkit編譯方法
S60 Webkit編譯方法是本文要介紹的內(nèi)容,主要是來(lái)了解并學(xué)習(xí)S60 Webkit應(yīng)用,把基本的s60 webkit的編譯環(huán)境給搭建好了,下一步就是要調(diào)整一下這個(gè)s60 webkit的編譯腳本了。打開(kāi)這個(gè)s60 webkit,應(yīng)該可以看到一個(gè)叫做build.bat文件,這個(gè)文件是windows下面的批處理文件(不過(guò)有趣的是,這個(gè)文件實(shí)際上是使用perl的語(yǔ)法編寫(xiě)的。)
按照官方的compile guide,需要用戶安裝carbide express 1.0才可以工作,但是我這邊懶得這么做了,浪費(fèi)硬盤(pán)空間,偶安裝的是carbide.c++ v1.3 oem版(hoho,這個(gè)版本的license可以從網(wǎng)上很容易地下載到)直接可以通過(guò)簡(jiǎn)單修改一下這個(gè)build.bat來(lái)實(shí)現(xiàn)自動(dòng)化編譯,當(dāng)然了,如果各位真的嚴(yán)格按照官方的guide一步一步做的話,大可不必像偶這么麻煩:
首先打開(kāi)C:\Symbian\9.1\S60_3rd\S60\build.bat,然后找到下面這樣的腳本:
- my $cbdhome = $ENV{CARBIDE_HOME} || '';
- $cbdhome = "$ENV{ProgramFiles}\\Carbide" unless -d $cbdhome;
- $cbdhome = "c:\\Carbide" unless -d $cbdhome;
- $cbdhome = "c:\\apps\\Carbide" unless -d $cbdhome;
這幾行應(yīng)該是為carbide express 1.0準(zhǔn)備的路徑,而我們目前用的是carbide.c++ v1.3,所以還是要做以下修改的:
- my $cbdhome = $ENV{CARBIDE_HOME} || '';
- # changed by wayne
- $cbdhome = "$ENV{ProgramFiles}\\Nokia\\Carbide.c++ v1.3" unless -d $cbdhome;
- $cbdhome = "$ENV{ProgramFiles}\\Carbide" unless -d $cbdhome;
- $cbdhome = "c:\\Carbide" unless -d $cbdhome;
- $cbdhome = "c:\\apps\\Carbide" unless -d $cbdhome;
從這里就可以看出來(lái)了吧?這里是添加了carbide.c++ v1.3的安裝路徑了。
然后下一步,就是要找到如下的地方:
- delete $ENV{'MWSYM2LIBRARIES'};
這一步也是為carbide express 1.0用的,用1.3的朋友,呵呵,很幸運(yùn)就可以不必用這個(gè)了,直接注釋掉即可,修改以后應(yīng)該是這個(gè)樣子的:
- # changed by wayne
- # delete $ENV{'MWSYM2LIBRARIES'};
另外,在這個(gè)build.bat中還有一個(gè)地方就是這里:
- my $sdkhome = $Registry->{ "HKEY_LOCAL_MACHINE/SOFTWARE/Symbian/Series 60/3rd Ed. SDK for Symbian OS/TargetDir" };
這里代表剛剛安裝的sdk在注冊(cè)表中的路徑,請(qǐng)親手確認(rèn)一下這個(gè)注冊(cè)表項(xiàng)是否真的存在,其指定的路徑是否正確(這一點(diǎn)對(duì)于多次安裝這個(gè)版本的sdk的朋友來(lái)說(shuō)是很重要的),如果不存在就手工創(chuàng)建它,或者手工把它修改正確。
好了,現(xiàn)在就可以進(jìn)入一下命令行,用devices命令確認(rèn)一下,當(dāng)前的sdk,就可以高高興興地開(kāi)始編譯了。
進(jìn)入:
- C:\Symbian\9.1\S60_3rd\S60\
然后輸入命令:
- build
不出意外的話,應(yīng)該開(kāi)始一段漫長(zhǎng)的編譯過(guò)程,hoho,偶的機(jī)器上編譯了10多分鐘呢。。。痛苦ing
然后就可以打開(kāi)模擬器,去看看效果了。這種方式的build只能夠編譯出來(lái)winscw的版本,只能夠在模擬器上使用。呵呵,很興奮是不是?已經(jīng)看到自己編譯出來(lái)的瀏覽器可以在手機(jī)上正常工作了是不是?!
如果真的要編譯成armv5或者gcce的版本,還有比較漫長(zhǎng)的路要走。編譯生成手機(jī)上可以工作的版本需要以下的一些工作,首先build.bat是可以帶命令行參數(shù)的,具體的定義如下:
- -n Do not include clean in compile
- -f run freeze phase and exit
- -g GCCE compiler for hardware build
- -w Code Warrior compiler for emulator build
- -t Target build
- -d Turn on debugging, forces udeb flavour
- -e Export generated environment and exit
- -r Remove S60Internal dependencies and exit
- -s X Map drive to this letter. Defaults to x
- -h View this message
我們?nèi)绻M幾g成手機(jī)可以使用的二進(jìn)制版本,就要使用build -g這個(gè)命令才行:
- build -g
初次運(yùn)行這個(gè)命令會(huì)發(fā)現(xiàn)如下錯(cuò)誤:
(1)關(guān)于"int64_t"數(shù)據(jù)類型的問(wèn)題出錯(cuò)的提示是這個(gè)樣子的:
- JavaScriptCore//bindings//HashFunctions.h:35:error:'int64_t' does not name a type..
這個(gè)錯(cuò)誤是由于編譯器里面沒(méi)有內(nèi)置int64_t之類的數(shù)據(jù)類型導(dǎo)致的(armv5的編譯器就沒(méi)有這個(gè)問(wèn)題)
解決的方法很簡(jiǎn)單:
修改c:\Symbian\9.1\S60_3rd\S60\JavaScriptCore\kjs\stdint.h文件,在末尾#endif的上面添加如下的定義:
- typedef long long int64_t;
- typedef unsigned long long uint64_t;
- typedef unsigned long uintptr_t;
- typedef unsigned long intptr_t;
這下子就不會(huì)在報(bào)告那個(gè)聒噪的問(wèn)題了,注意必需要在這個(gè)文件里面做修改,直接修改:
- epoc32\include\oem\javascriptcore\stdint.h
這個(gè)文件是無(wú)效的,因?yàn)槊看蝏uild都會(huì)重新把JavaScriptCore里面的這個(gè)stdint.h拷貝到sdk的include\oem\javascriptcore目錄下面,會(huì)把你修改過(guò)的stdint.h覆蓋掉,因此,必需要在s60 webkit的源代碼里面進(jìn)行修改。
(2)關(guān)于memman的錯(cuò)誤
出錯(cuò)的提示是這個(gè)樣子的:
- elf2e32:Error:E1036:Symbol _ZTI15CSimpleNotifier, _ZTI15CSimpleNotifier Missing
- from ELF File:..\EPOC32\BUILD\MEMMAN\GCCE\UREL\MemMan_sdk.dll....
這個(gè)錯(cuò)誤是由于似乎導(dǎo)出函數(shù)里面少了一個(gè)函數(shù)導(dǎo)致的,解決的方法也很簡(jiǎn)單,修改c:\Symbian\9.1\S60_3rd\S60\MemoryManager\Eabi\MemMan_sdkU.DEF文件,
原文是:
- _ZTIV15CSimpleNotifier @ 27 NONAME ; DATA
修改為:
- _ZTIV15CSimpleNotifier @ 27 ABSENT ; DATA
好了,然后就可以使用build -g重新編譯了,編譯完畢后,會(huì)有相關(guān)的dll的安裝包,然后就可以自己修改和集成了(剩下的偶不想多說(shuō)了,各位應(yīng)該都是高手,都能找到調(diào)用這些webkit dll的方法),想想看,如果能夠在自己的程序中集成一個(gè)全功能的內(nèi)置瀏覽器,會(huì)不會(huì)感覺(jué)很爽?在推廣自己的客戶端軟件產(chǎn)品的同時(shí)也把自己的wap網(wǎng)站也一并推廣了。
(3)關(guān)于代碼中的幾處namespace忘記加分號(hào)結(jié)尾的問(wèn)題,有幾處需要修改的:
- c:\Symbian\9.1\S60_3rd\S60\WebKit\BrowserView\inc\WidgetExtension.h
定義如下的namespace,但是忘記加上分號(hào)了:
- namespace KJS {
- class WidgetEventHandler;
- }
應(yīng)該改為:
- namespace KJS {
- class WidgetEventHandler;
- }; // <----------注意,這里增加了一個(gè)分號(hào)!!
- c:\Symbian\9.1\S60_3rd\S60\WebCore\khtml\dom\dom_string.h
改為如下定義,加上分號(hào),不再贅述:
- namespace khtml {
- class Length;
- }; // <----------注意,這里增加了一個(gè)分號(hào)??!
- c:\Symbian\9.1\S60_3rd\S60\WebCore\khtml\misc\loader.h
改為如下定義,加上分號(hào),不再贅述:
- namespace KIO {
- class Job;
- class TransferJob;
- }; // <----------注意,這里增加了一個(gè)分號(hào)!!
(4)增加幾個(gè)函數(shù)定義
在java script core里面,有幾個(gè)函數(shù)是沒(méi)有定義的,需要手工添加進(jìn)去:
- c:\Symbian\9.1\S60_3rd\S60\JavaScriptCore\group\BMARM\JavaScriptCoreU.def
打開(kāi)這個(gè)文件,然后在該文件的末尾添加如下定義:
- _ZN3KJS11Interpreter30createLanguageInstanceForValueEPNS_9ExecStateENS_8Bindings8Instance15
- BindingLanguageERKNS_6ObjectEPKNS3_10RootObjectESB_ @ 389 NONAME
- _ZN3KJS16RuntimeObjectImpC1EPNS_8Bindings8InstanceEb @ 390 NONAME _ZN3KJS16RuntimeObject
- ImpC2EPNS_8Bindings8InstanceEb @ 391 NONAME _ZTIN3KJS16RuntimeObjectImpE @ 392 NONAME ;
- #<TI># _ZTVN3KJS16RuntimeObjectImpE @ 393 NONAME ;
- #<VT># _ZN3KJS15ProtectedValues20decreaseProtectCountEPNS_8ValueImpE @ 394 NONAME
- _ZN3KJS15ProtectedValues20increaseProtectCountEPNS_8ValueImpE @ 395 NONAME
- _ZN3KJS8Bindings10RootObject14setInterpreterEPNS_11InterpreterE @ 396 NONAME
- _ZN3KJS8Bindings10RootObject25removeAllNativeReferencesEv
- @ 397 NONAME _ZN3KJS8Bindings8Instance32createBindingForLanguageInstanceENS1_15BindingLanguageEPvPKNS0_10RootObjectE @ 398 NONAME
- _NPN_CreateScriptObject @ 399 NONAME
(5)解決aiwdialdata.dso找不到的問(wèn)題
修改c:\Symbian\9.1\S60_3rd\S60\WebKit\group\webkit.mmp文件
將原來(lái)的:
- LIBRARY aiwdialdata.lib
改為:
- #ifndef __BROWSER_SDK
- LIBRARY aiwdialdata.lib
- #endif
然后先用build -g編譯,如果有問(wèn)題再用build -nfg編譯吧這些dll的出口給freeze一下,然后再用build -g來(lái)編譯,就在/epoc32/release/gcce/urel目錄下面生成如下的dll:
- BrowserCache_sdk.dll
- BrowserRec_sdk.DLL
- HistoryProvider_sdk.dll
- JavaScriptCore_sdk.DLL
- MemMan_sdk.dll
- pagescaler_sdk.dll <---這個(gè)dll應(yīng)該不是編譯出來(lái)的,應(yīng)該是S60WebKit自帶的
- WebCore_sdk.dll
- WebUi.exe
這些有了就可以查看那個(gè)S60WebUi的目錄,具體地去看如何使用這些dll了。
小結(jié):解析S60 Webkit編譯方法的內(nèi)容介紹完了,希望通過(guò)S60 Webkit應(yīng)用內(nèi)容的學(xué)習(xí)能對(duì)你有所幫助!