代码之家  ›  专栏  ›  技术社区  ›  Donal Rafferty

将Symbian C++移植到Android NDK中

  •  2
  • Donal Rafferty  · 技术社区  · 14 年前

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

    代码中有很多Symbian特定的代码,而且我对C++的体验很小,所以不太好。

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

    目前,编译器正在为未识别的类型抛出各种各样的错误。

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

    色调、tbool、tdesc8、rsocket、tinetadress、tbuf、hbufc, RPoT阵列

    在编译器中将tint和tbool分别更改为int和bool可以工作,但我不确定对其他类型使用什么?

    有人能帮我吗?特别是TDESC、TBUF、HBUF和RPO协议。


    此外,Symbian还具有一个使用

    纽尔

    纽卡

    但是把它变成一个普通的C++构造函数可以吗?


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

    4 回复  |  直到 14 年前
        1
  •  1
  •   michael aubert    14 年前

    在没有熟知Symbian习惯用法的情况下,尝试将Symbian OS C++移植到标准C++是一个坏主意。

    这很可能是这些项目中的一个,正确的做法是从头重写大部分代码。如果你几乎不知道你要使用的语言,那就没什么必要去欺骗自己,让自己认为你不会犯错误,浪费时间,并且无论如何都会扔掉新的代码。这是学习的一部分。

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

    描述符(TDESC、TBUF和HBUF都属于描述符类层次),模板(数组、队列、列表…)在标准C++中预处理它们的等价物,同时处理诸如清理堆栈、编码标准、内存管理和完整性等问题。

    如果您想了解相关的插件: Quick Recipes On Symbian OS 是最近一次试图用尽可能少的几页来解释这一切的尝试。

    你也应该看看 Foundation 网站开始。

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

    后缀为c的描述符类是不可变的(不过,通常可以从中创建可变的描述符)。

    hbufc几乎是唯一一个前缀为h的symbian类。它应该总是在堆上分配。

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

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

    处理对象集合和指向对象的指针集合之间差异的典型方法是谁拥有集合中的对象。集合在添加对象时拥有这些对象,在删除对象时将其释放(因此,当对象本身被销毁时,负责删除它仍然包含的每个对象),或者集合不传输所有权,而其他一些内容必须确保它包含的对象在集合的生存期内保持有效。

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

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

    正确的操作当然不容易,但这就是这个操作系统的工作原理。

        2
  •  3
  •   David Crookes    14 年前

    我不确定您是否仍然感兴趣,但有一种可能是,在使用euser.dll的symbian习惯用法(即,tdec派生类、rpointer*等)中,您可能会发现从symbian开发人员站点获取开放源代码epl,并将其直接添加到端口中是一个可行的选项。那是尤瑟必要部分的港口(也许还有其他部分?).

    但是,如果您当前的代码库已经使用了许多其他的子系统,那么您将看到这变得非常难以处理。

        3
  •  2
  •   David Rodríguez - dribeas    14 年前

    您应该尝试阅读一些有关Symbian开发的介绍性文本。他们以前在Symbian网站上有一些例子,我相信您可以找到具体的文档,说明您想要的类型是如何使用的,以及它们提供了什么。

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

        4
  •  2
  •   alexanderblom    14 年前

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

    另一种方法可能是使用便携式 C/C++ 对于核心,在Symbian和Android版本上使用它,同时为每个平台分别执行UI操作。Spotify已经在Android和iPhone上完成了这项工作。