2

我已经获得了一些 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 也有一个两相构造器,使用

新L

新Lc

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


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

4

4 回答 4

3

我不确定您是否仍然感兴趣,但一种可能是 Symbian 惯用语使用 EUSER.DLL(即 TDesC 派生类、RPointer* 等),您可能会发现从 Symbian 开发人员那里获取开源 EPL 代码站点并将其直接添加到您的端口中是一个可行的选择。那是对 EUSER 必要位的移植(也许还有其他?)。

但是,如果您当前的代码库已经使用了许多其他子系统,您会发现这变得非常笨拙。

于 2010-04-26T21:23:03.673 回答
2

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

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

于 2010-04-22T09:08:47.023 回答
2

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

另一种方法可能是使用可移植C/C++的内核,并在 Symbian 和 Android 版本上使用它,同时为每个平台单独做 UI 工作。Spotify 已经在 Android 和 iPhone 上做到了这一点。

于 2010-04-22T10:36:24.923 回答
1

如果对 Symbian 惯用语的作用没有很好的理解,就尝试将 Symbian OS C++ 移植到标准 C++ 通常是个坏主意。

这很可能是这些项目之一,其中正确的做法是从头开始重写大部分代码。如果您几乎不了解您所针对的语言,那么欺骗自己认为自己不会犯错误、浪费时间并丢弃新代码是没有意义的。这都是学习的一部分。

CleanupStack 机制旨在帮助您处理任何可能出错的情况,包括断电和内存不足的情况。从技术上讲,如今,它被实现为 C++ 异常,但它涵盖的范围超出了标准 C++ 代码通常处理的常见错误情况。

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

一个相关的插件,如果您想了解它:Symbian OS上的快速食谱是最近尝试在尽可能少的页面中解释所有内容的尝试。

您还应该查看基金会网站以开始使用。

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

以 C 为后缀的描述符类是不可变的(不过,通常可以从它们创建一个可变的描述符)。

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

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

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

处理对象集合和指向对象的指针集合之间差异的一种典型方法是谁拥有集合中的对象。要么集合在添加对象时拥有对象,而在删除对象时丢失它们(因此负责删除它在自身销毁时仍包含的每个对象),或者集合不转移所有权,其他东西必须确保对象它包含将在集合的生命周期内保持有效。

考虑集合的另一种方式是,当您向集合添加/获取对象时,您希望复制多少对象。

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

正确地做到这一点当然不容易,但这就是该操作系统的工作方式。

于 2010-04-22T10:15:41.900 回答