Портирование Symbian C ++ на Android NDK - PullRequest
2 голосов
/ 22 апреля 2010

Мне дали немного кода на 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 ]

3 голосов
/ 27 апреля 2010

Я не уверен, что вы все еще заинтересованы, но одна возможность состоит в том, что там, где идиомы Symbian используют EUSER.DLL (то есть производные классы TDesC, RPointer * и т. Д.), Вы можете найти взяв код EPL с открытым исходным кодом.с сайта разработчика Symbian и добавление его прямо в ваш порт жизнеспособный вариант.Это порт над необходимыми битами EUSER (и, возможно, других?).

Однако, если ваша текущая кодовая база уже использует множество других подсистем, вы увидите, что это станет очень громоздким.

2 голосов
/ 22 апреля 2010

Если это не очень большая кодовая база, может быть проще / быстрее начать все с нуля и делать все в стиле Android. Даже если вам требуется NDK/C++, этот подход может быть быстрее.

Другой подход может заключаться в том, чтобы использовать ядро ​​C/C++ и использовать его в версиях для Symbian и Android, одновременно выполняя пользовательский интерфейс отдельно для каждой платформы. Spotify сделал это на Android и iPhone.

2 голосов
/ 22 апреля 2010

Вы должны попытаться прочитать вводный текст по разработке для Symbian. Раньше у них было несколько примеров на сайте Symbian, и я уверен, что вы можете найти конкретные документы о том, как типы, которые вы хотите использовать, предназначены и что они предоставляют.

Проблема заключается в том, что разработка symbian имеет свои собственные идиомы, которые нельзя / не следует напрямую использовать вне среды symbian, например, двухфазное построение со стеком очистки не требуется в средах, где у компилятора есть надлежащие механизмы обработки исключений - в Symbian конструктор, который бросает, может привести к всевозможным хаосам.

1 голос
/ 22 апреля 2010

Обычно было бы плохой идеей попытаться перенести Symbian OS C ++ на стандарт C ++, не имея четкого понимания того, что делают идиомы Symbian.

Это вполне может быть один из таких проектов, гдеПравильно было бы переписать большую часть кода с нуля.Если вы едва знаете язык, на который вы нацелены, нет смысла вводить себя в заблуждение, полагая, что вы не будете делать ошибок, тратить время и выбрасывать новый код в любом случае.Это все часть обучения.

Механизм CleanupStack предназначен для того, чтобы помочь вам справиться со всем, что может пойти не так, как сбои питания и нехватка памяти.Технически, в наши дни он реализован как исключения C ++, но он охватывает больше, чем обычные случаи ошибок, которые обычно обрабатывает стандартный код C ++.

Дескрипторы (TDesc, TBuf и HBuf все принадлежат иерархии классов дескрипторов) и шаблоны (массивы, очереди, списки ...) предшествуют их эквивалентам в стандартном C ++, имея дело с такими проблемами, как CleanupStack, стандарты кодирования, управление памятью и целостность ...

Соответствующий плагин, если вы хотите узнать об этом: Быстрые рецепты на Symbian OS - это недавняя попытка объяснить все это на как можно меньшем количестве страниц.

Вы также должны обязательно зайти на сайт Foundation , чтобы начать работу.

Предполагается, что классы с префиксом T сами по себе достаточно малы, чтобы их можно было размещать в стеке.

Классы дескрипторов с суффиксом C подразумевают неизменяемость (обычно изменяемый дескриптороднако, из них можно создать).

HBufC - почти единственный префикс класса SymbianОбозначается буквой H. Он всегда должен быть размещен в куче.

Метод с суффиксом C добавит объект в CleanupStack при успешном возврате (обычно это объект, который он возвращает).Это зависит от вызывающего кода для Pop этого объекта.

Классы с префиксом R предназначены для размещения в стеке, но управляют своими собственными ресурсами на основе кучи.У них обычно есть какой-то метод Close (), который нужно вызывать перед их деструктором.

Типичный способ разобраться в различиях между коллекцией объектов и коллекцией указателей на объект - это кто владеет объектамив коллекции.Либо коллекция владеет объектами при их добавлении и теряет их при удалении (и, следовательно, отвечает за удаление каждого объекта, который все еще содержится, когда она сама уничтожена), либо коллекция не передает права собственности, и что-то еще должно обеспечивать объектыСодержимое останется действительным в течение всего времени жизни коллекции.

Еще один способ думать о коллекциях - это то, сколько копий объектов вы хотите получить при добавлении / получении объектов в / из коллекции.

Классы дескрипторов и коллекций Symbian предназначены для охвата всех этих различных способов использования памяти и позволяют вам выбрать тот, который вам нужен, исходя из того, что вы хотите сделать.

Конечно, сделать это правильно непросто, но вот какэта операционная система работает.

...