【问题标题】:Porting Symbian C++ to Android NDK将 Symbian C++ 移植到 Android NDK
【发布时间】:2010-04-22 08:48:06
【问题描述】:

我得到了一些 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

NewLc

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


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

【问题讨论】:

  • 我们大概讨论了多少行代码?出于性能原因,您是否需要使用 NDK?应用程序做什么?
  • 应用程序是基于 RTP 的音频编码和解码,因此出于性能原因使用 NDK。至于目前只有 RTP 类的代码谎言,大约 3000 个,稍后添加编解码器和编码将使其更大

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢 David,我一直在阅读 Symbian,我觉得我现在什至可以在其中编写一个基本程序 :) ,问题是我必须学习 C++ 语法和思想同时,我现在不确定如何将 Tdesc、RPointerArray 更改为可以在普通 C++ (libc) 中编译的东西
    • 我在 2003 年做过一些 Symbian C++,所以我不太记得了。如果我没记错的话,TDesc 系列类型用于字符串,如果可以的话,你应该使用std::string,但转换不会是直截了当的。您可能需要考虑使用 C 风格的字符串 (const char*),因为它们可能更接近于 TDesc。 RPointerArray 是一个指针数组,其内存在其他地方进行管理。根据您想要进行多少重构,您可以将其替换为指针数组,或将应用程序转换为使用智能指针(更安全,还有更多工作要做)
    • 谢谢大卫,Char 似乎是 TDesc 的一个很好的替代品,目前正在研究 RPointerArrays,它们非常麻烦,还有什么是 HBufc?我想那里有某种缓冲?
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,我已经停止尝试移植 Symbian C++,因为对于大型代码库和重新评估选项来说太难了
    • 另外,编写标准的、可移植的 C++ 感觉好多了,尽管你的老板可能不会接受这个论点。
    【解决方案4】:

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

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

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

    描述符(TDesc、TBuf 和 HBuf 都属于描述符类层次结构)和模板(数组、队列、列表...)在处理诸如 CleanupStack、编码标准、内存管理和诚信...

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

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

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

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

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

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

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

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

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

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

    把它做好当然不容易,但这就是这个操作系统的工作原理。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 2012-08-15
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多