S60 Webkit编译方法是本文要介绍的内容,主要是来了解并学习S60 Webkit应用,把基本的s60 webkit的编译环境给搭建好了,下一步就是要调整一下这个s60 webkit的编译脚本了。打开这个s60 webkit,应该可以看到一个叫做build.bat文件,这个文件是windows下面的批处理文件(不过有趣的是,这个文件实际上是使用perl的语法编写的。)
按照官方的compile guide,需要用户安装carbide express 1.0才可以工作,但是我这边懒得这么做了,浪费硬盘空间,偶安装的是carbide.c++ v1.3 oem版(hoho,这个版本的license可以从网上很容易地下载到)直接可以通过简单修改一下这个build.bat来实现自动化编译,当然了,如果各位真的严格按照官方的guide一步一步做的话,大可不必像偶这么麻烦:
首先打开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;
这几行应该是为carbide express 1.0准备的路径,而我们目前用的是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;
从这里就可以看出来了吧?这里是添加了carbide.c++ v1.3的安装路径了。
然后下一步,就是要找到如下的地方:
- delete $ENV{'MWSYM2LIBRARIES'};
这一步也是为carbide express 1.0用的,用1.3的朋友,呵呵,很幸运就可以不必用这个了,直接注释掉即可,修改以后应该是这个样子的:
- # changed by wayne
- # delete $ENV{'MWSYM2LIBRARIES'};
另外,在这个build.bat中还有一个地方就是这里:
- my $sdkhome = $Registry->{ "HKEY_LOCAL_MACHINE/SOFTWARE/Symbian/Series 60/3rd Ed. SDK for Symbian OS/TargetDir" };
这里代表刚刚安装的sdk在注册表中的路径,请亲手确认一下这个注册表项是否真的存在,其指定的路径是否正确(这一点对于多次安装这个版本的sdk的朋友来说是很重要的),如果不存在就手工创建它,或者手工把它修改正确。
好了,现在就可以进入一下命令行,用devices命令确认一下,当前的sdk,就可以高高兴兴地开始编译了。
进入:
- C:\Symbian\9.1\S60_3rd\S60\
然后输入命令:
- build
不出意外的话,应该开始一段漫长的编译过程,hoho,偶的机器上编译了10多分钟呢。。。痛苦ing
然后就可以打开模拟器,去看看效果了。这种方式的build只能够编译出来winscw的版本,只能够在模拟器上使用。呵呵,很兴奋是不是?已经看到自己编译出来的浏览器可以在手机上正常工作了是不是?!
如果真的要编译成armv5或者gcce的版本,还有比较漫长的路要走。编译生成手机上可以工作的版本需要以下的一些工作,首先build.bat是可以带命令行参数的,具体的定义如下:
- -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
我们如果希望编译成手机可以使用的二进制版本,就要使用build -g这个命令才行:
- build -g
初次运行这个命令会发现如下错误:
(1)关于"int64_t"数据类型的问题出错的提示是这个样子的:
- JavaScriptCore//bindings//HashFunctions.h:35:error:'int64_t' does not name a type..
这个错误是由于编译器里面没有内置int64_t之类的数据类型导致的(armv5的编译器就没有这个问题)
解决的方法很简单:
修改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;
这下子就不会在报告那个聒噪的问题了,注意必需要在这个文件里面做修改,直接修改:
- epoc32\include\oem\javascriptcore\stdint.h
这个文件是无效的,因为每次build都会重新把JavaScriptCore里面的这个stdint.h拷贝到sdk的include\oem\javascriptcore目录下面,会把你修改过的stdint.h覆盖掉,因此,必需要在s60 webkit的源代码里面进行修改。
(2)关于memman的错误
出错的提示是这个样子的:
- elf2e32:Error:E1036:Symbol _ZTI15CSimpleNotifier, _ZTI15CSimpleNotifier Missing
- from ELF File:..\EPOC32\BUILD\MEMMAN\GCCE\UREL\MemMan_sdk.dll....
这个错误是由于似乎导出函数里面少了一个函数导致的,解决的方法也很简单,修改c:\Symbian\9.1\S60_3rd\S60\MemoryManager\Eabi\MemMan_sdkU.DEF文件,
原文是:
- _ZTIV15CSimpleNotifier @ 27 NONAME ; DATA
修改为:
- _ZTIV15CSimpleNotifier @ 27 ABSENT ; DATA
好了,然后就可以使用build -g重新编译了,编译完毕后,会有相关的dll的安装包,然后就可以自己修改和集成了(剩下的偶不想多说了,各位应该都是高手,都能找到调用这些webkit dll的方法),想想看,如果能够在自己的程序中集成一个全功能的内置浏览器,会不会感觉很爽?在推广自己的客户端软件产品的同时也把自己的wap网站也一并推广了。
(3)关于代码中的几处namespace忘记加分号结尾的问题,有几处需要修改的:
- c:\Symbian\9.1\S60_3rd\S60\WebKit\BrowserView\inc\WidgetExtension.h
定义如下的namespace,但是忘记加上分号了:
- namespace KJS {
- class WidgetEventHandler;
- }
应该改为:
- namespace KJS {
- class WidgetEventHandler;
- }; // <----------注意,这里增加了一个分号!!
- c:\Symbian\9.1\S60_3rd\S60\WebCore\khtml\dom\dom_string.h
改为如下定义,加上分号,不再赘述:
- namespace khtml {
- class Length;
- }; // <----------注意,这里增加了一个分号!!
- c:\Symbian\9.1\S60_3rd\S60\WebCore\khtml\misc\loader.h
改为如下定义,加上分号,不再赘述:
- namespace KIO {
- class Job;
- class TransferJob;
- }; // <----------注意,这里增加了一个分号!!
(4)增加几个函数定义
在java script core里面,有几个函数是没有定义的,需要手工添加进去:
- c:\Symbian\9.1\S60_3rd\S60\JavaScriptCore\group\BMARM\JavaScriptCoreU.def
打开这个文件,然后在该文件的末尾添加如下定义:
- _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找不到的问题
修改c:\Symbian\9.1\S60_3rd\S60\WebKit\group\webkit.mmp文件
将原来的:
- LIBRARY aiwdialdata.lib
改为:
- #ifndef __BROWSER_SDK
- LIBRARY aiwdialdata.lib
- #endif
然后先用build -g编译,如果有问题再用build -nfg编译吧这些dll的出口给freeze一下,然后再用build -g来编译,就在/epoc32/release/gcce/urel目录下面生成如下的dll:
- BrowserCache_sdk.dll
- BrowserRec_sdk.DLL
- HistoryProvider_sdk.dll
- JavaScriptCore_sdk.DLL
- MemMan_sdk.dll
- pagescaler_sdk.dll <---这个dll应该不是编译出来的,应该是S60WebKit自带的
- WebCore_sdk.dll
- WebUi.exe
这些有了就可以查看那个S60WebUi的目录,具体地去看如何使用这些dll了。
小结:解析S60 Webkit编译方法的内容介绍完了,希望通过S60 Webkit应用内容的学习能对你有所帮助!