北京理工大学 20981 陈罡
好了,接着上一篇,我们继续,根据上一篇的描述,我们应该可以把基本的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_8Bindings8Instance15BindingLanguageERKNS_6ObjectEPKNS3_10RootObjectESB_ @ 389 NONAME
_ZN3KJS16RuntimeObjectImpC1EPNS_8Bindings8InstanceEb @ 390 NONAME _ZN3KJS16RuntimeObjectImpC2EPNS_8Bindings8InstanceEb @ 391 NONAME _ZTIN3KJS16RuntimeObjectImpE @ 392 NONAME ; ## _ZTVN3KJS16RuntimeObjectImpE @ 393 NONAME ; ## _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了。
祝大家好运!
阅读(6006) | 评论(5) | 转发(0) |