Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1534900
  • 博文数量: 114
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1357
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 18:13
文章分类
文章存档

2010年(8)

2009年(9)

2008年(27)

2007年(62)

2006年(8)

我的朋友

分类: C/C++

2009-01-05 10:58:06

北京理工大学  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) |
给主人留下些什么吧!~~

chinaunix网友2010-08-31 20:12:15

能够给我发一份21772的代码吗?SVN服务器停了。我的邮箱: zhuweisong08@qq.com 谢谢

chinaunix网友2010-07-26 14:04:41

不好意思 那个信箱写错了 是:wangjiyou@126.com

chinaunix网友2010-07-26 13:55:58

现在是否还有s60webkit 21772这个源码。有的话可否给我传一份wangjiyou@126.con 谢谢啦

chinaunix网友2009-02-26 17:10:53

你好, 我下载了S60WebKit,但是找不到版本号?从那个文件可以看到版本21772 编译时报错找不到 e32hashtab.h和browserlauncher.h. 是我的版本问题吧.

chinaunix网友2009-01-05 16:28:24

请问如何在carbide下编绎通过?