将Symbian C ++移植到Android NDK

时间:2010-04-22 08:48:07

标签: c++ android symbian porting android-ndk

我已经获得了一些Symbian C ++代码,可以移植到Android NDK上。

代码中有很多Symbian特定的代码,我对C ++的经验很少,所以它不太顺利。

让我失望的主要原因是试图找出在普通C ++中使用Symbian特定代码的替代方案。

当编译器为无法识别的类型抛出各种错误时。

根据我最近的研究,这些是我认为特定于Symbian的类型:

  

TInt,TBool,TDesc8,RSocket,TInetAddress,TBuf,HBufc,   RPointerArray

将TInt和TBool分别更改为int和bool分别适用于编译器,但我不确定其他类型的用途是什么?

任何人都可以帮助我吗?特别是TDesc,TBuf,HBuf和RPointerArray。


Symbian还有一个使用

的两阶段构造函数
  

的NewL

  

NewLc

但是将它更改为普通的C ++构造函数还可以吗?


最后Symbian使用清理堆栈来帮助消除内存泄漏我认为,删除清理堆栈代码是可以接受的,我认为它应该用try / catch语句替换?

4 个答案:

答案 0 :(得分:3)

我不确定您是否仍然感兴趣,但有一种可能性是Symbian习语使用EUSER.DLL(即TDesC派生类,RPointer *等),您可能会发现使用开源EPL代码从Symbian开发者网站上直接添加到您的端口是一个可行的选择。那是EUSER(和其他人可能?)的必要部分。

但是,如果您当前的代码库已经使用了很多其他子系统,那么您将会看到它变得非常笨拙。

答案 1 :(得分:2)

您应该尝试阅读有关Symbian开发的一些介绍性文章。他们曾经在Symbian网站上有一些例子,我相信你可以找到关于你想要使用的类型以及它们提供的内容的具体文档。

问题在于,symbian开发有自己的习惯用法不能/不应该直接在symbian环境之外使用,例如在编译器具有适当的异常处理机制的环境中不需要使用具有清理栈的两阶段构造 - 在Symbian中,投掷的构造函数会导致各种各样的混乱。

答案 2 :(得分:2)

如果这不是一个非常大的代码库,那么从头开始并做一切Android风格可能更容易/更快。即使您需要NDK/C++,这种方法也可能更快。

另一种方法可能是将可移植C/C++用于核心,并在Symbian和Android版本上使用它,同时为每个平台分别执行UI内容。 Spotify在Android和iPhone上完成了这项工作。

答案 3 :(得分:1)

尝试将Symbian OS C ++移植到标准C ++通常是一个坏主意,而不必非常了解Symbian习惯用法。

这很可能就是这些项目中的一个,正确的做法是从头开始重写大部分代码。如果你几乎不知道你所针对的语言,那么就没有必要让自己认为你不会犯错误,浪费时间并抛弃新的代码。这都是学习的一部分。

CleanupStack机制旨在帮助您处理可能出错的任何问题,包括断电和内存不足情况。从技术上讲,这些日子它是作为C ++异常实现的,但它涵盖的不仅仅是标准C ++代码通常处理的常见错误情况。

描述符(TDesc,TBuf和HBuf都属于描述符类层次结构)和模板(数组,队列,列表......)早于标准C ++中的等价物,同时处理CleanupStack,编码标准,内存管理和完整性...

相关插件如果您想了解它:Quick Recipes On Symbian OS是最近尝试在尽可能少的页面中解释所有内容。

您还应该查看Foundation网站以开始使用。

以T为前缀的类本身就足够小,可以在堆栈上分配。

以C为后缀的描述符类意味着不可变(但通常可以从它们创建可变描述符)。

HBufC几乎是唯一以H为前缀的Symbian类。应始终在堆上分配。

以C为后缀的方法将在CleanupStack成功返回时添加一个对象(通常,它是它返回的对象)。由弹出该对象的调用代码决定。

以R为前缀的类意味着在堆栈上分配,但管理自己的基于堆的资源。它们通常有一些需要在析构函数之前调用的Close()方法。

关于对象集合和对象指针集合之间差异的典型方法是谁拥有集合中的对象。集合在添加时拥有对象,在删除对象时将其丢失(因此负责删除它本身被销毁时仍然包含的每个对象)或集合不转移所有权,其他必须确保对象它包含将在收集的一生中保持有效。

考虑集合的另一种方法是在向集合中添加对象或从集合中获取对象时要复制多少对象。

Symbian描述符和集合类旨在涵盖所有这些使用内存的不同方式,让您根据自己的需要选择所需的方式。

这样做肯定不容易,但这就是这个操作系统的工作方式。