Symbian official > Symbian <

Основное правило разработчика на Symbian: 

Если проект можно реализовать на J2ME, то нужно реализовать его на J2ME

 [ФОРУМ] [КОНТАКТЫ] [ССЫЛКИ]

 

Введение

Итак вы решили написать приложение для Symbian OS. Стойте! Первым делом прочитайте Основное Правило..., вынесенное в заголовок! Разработка под Symbian OS очень сложное дело. Необходимо иметь глубокие познания в языке C++ и прилежно изучать предоставляемый API. Многое в парадигме разработки покажется странным и загадочным. Многое придется постигать с нуля. То с чем вы столкнетесь:

  • Трудности в поиске документации (да и та вся на английском)

  • Отсутствие привычного представления строк в языке

  • Специфичные для Symbian приемы работы с памятью

  • Специфичные способы обработки исключительных ситуаций

  • Интересная модель многозадачности (которая на самом деле вовсе и не многозадачность), называемая Active Objects

  • Трудности компиляции, связанные с тем, что придется-таки использовать командную строку

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

Мой опыт ограничивается разработкой под телефоны Nokia 60 серии, так что разговор здесь будет в основном об этом аспекте программирования под OS Symban.

Необходимый софт

Итак, начнем с того, что необходимо, чтобы начать разработку. Средств разработки существует несколько. Вот они:

Я пользовался только последним комплектом, поэтому ничего определенного о других двух сказать не могу. Для CodeWarrior'а наверняка потребуется Nokia Series 60 SDK for Symbian OS. Итак, как поставить все, что нужно, если вы пошли моим путем.

Сначала ставите студию. Сразу нужно сказать, что SDK заточен под 6/97 MS Visual Studio, т.е. для этих версий есть специальный визард, преобразующий ваш программный проект из того вида, который принят в Symbian в тот, который понимает студия. Но если у вас VS.NET (как и у меня), не отчаивайтесь. Есть специальная утилитка EpocFromMMP (разработанная судя по всему нашим соотечественником), которая добовляет визард для создания новых проектов из MMP файлов (которые суть проекты Symbian). В данный момент она распространяется платно (она кстати того стоит). Но у меня осталась старая бесплатная версия, скачать можно здесь. Она просто копирует все нужные файлы (на самом деле не все, некоторые потом приходится вручную докопировать) в папку проекта и создает этот самый проект, настраивая все нужные свойства. 

Update: теперь EpocFromMMP выходит под маркой beekeros - на сайте доступна бесплатная версия.

Сразу один момент - EpocFromMMP этой версии не понимает многострочные комментарии в MMP файлах вида

/*
* ============================================================================
* Name : AknExEditor.mmp
* Part of : AknExEditor
* Copyright (c) 2003 Nokia. All rights reserved.
* ============================================================================
*/


поэтому такие комментарии из MMP файла перед использованием визарда придется удалить.

Следующий этап - поставить Nokia S60 SDK for Symbian OS (если вы конечно разрабатываете под Nokia). Его можно бесплатно скачать с сайта Nokia (см. ссылку выше), правда весит он под 100Мб. Это набор из компилятора (на самом деле используется компилятор студии), эмулятора, примеров, документации, различных утилит и т.д. и т.п. Интерфейс мягко говоря не дружественный %) Когда ставите SDK не забудьте установить Perl! Все скрипты компиляции и других вещей написаны на Perl'e. Еще нужна Java. На яве там несколько программулин, без которых впрочем вполне можно обойтись, но возможно она необходима для правильной работы эмулятора. Причем программулины в той версии SDK, которая есть у меня, работают только с JRE 1.3, а мне нужна на машине 1.4.1 минимум %) Один момент - не изменяйте пожалуйста папку, в которую ставится SDK! Может у меня руки кривы, но в другой папке (и упаси вас бог поставить ее на диск, отличный от того, где стоит VS) SDK у меня жестоко глючил. Когда вы поставите SDK, вы обнаружите в папке с ним следующее:

  • Epoc32 - тут находятся все скрипты, эмулятор и т.п.

  • Epoc32Ex - примеры, стандартные для OS Symbian

  • Series60Doc - документация. Хелп начинается с файла start.chm, кроме того есть несколько полезных вещей в PDF формате. Рекомендую Coding Idioms for Symbian OS

  • Series60Ex - примеры, специфичные для Symbian OS телефонов Nokia 60й серии

  • Series60Tools - различные дополнительные примочки, которыми я не пользуюсь

Ну вот и все. Можно приступать к работе %)

Компиляция и запуск с командной строки

Здесь описывается, как скомпилировать и запустить ваше приложение для Symbian. В качестве примера было выбрано приложение form из примеров, поставляемых с инсталляцией. Находятся примеры в папке %EPOCROOT%\Series60Ex. Здесь и далее %EPOCROOT% - переменная окружения, содержащая папку, в которой установлен SDK. У меня это \Symbian\6.1\Series60\. Обратите внимание, что буква диска не присутствует, так что если у вас проект на другом по сравнению с инсталляцией диске, то можно ожидать неприятностей.

Итак, сначала – структура проекта. По папкам: 

  • aif –содержит исходную информация для aiftool’a. Позволяет изменять иконку, название приложения и т.п.
  • group – содержит собственно проект (*.mmp файл), файл ресурсов приложения (*.rss), информацию для создания компиляционных файлов (bld.inf) и еще что-нибудь %)
  • inc – содержит заголовочные файлы проекта (*.h) и еще кое-что.
  • sis – содержит файл с информацией для запаковщика makesis (*.pkg) и сам готовый sis файл, который и есть готовое к установке на телефоне приложение (точнее архив с ним).
  • src – содержит исходные файлы проекта (*.cpp).

Начнем с компиляции с командной строки для Windows и для телефона.

1. Нужно в папке group создать компиляционные файлы командой bldmake bldfiles. При этом в папке появится файл abld.bat, который используется для компиляции.

2. Для компиляции на телефон нужно использовать команду abld build thumb urel. В документации рекомендуется использовать платформу armi вместо thumb, но эта информация устаревшая, на сколько мне известна. При компиляции может возникнуть ошибка, связанная с тем, что не находится компоновщик nmake.exe. Найдите его и пропишите путь в PATH. После этого все должно скомпилироваться.

Внимание! Если у вас пользователь с именем, содержащим русские буквы, то компилятор (используется gcc) не сможет получить доступ к папке с временными файлами и компиляция завершится с ошибкой.

Результат компиляции находится в папке %EPOCROOT%\Epoc32\Release\thumb\urel\. Результатом является файл приложения (*.app, в данном случае AknExForm.app), файлы ресурсов (*.rsc), результат работы aiftool (*.aif). Тут же могут находится файлы изображений (*.mbm) и другие файлы. 

3. Для подготовки инсталляции (sis – архива) необходимо зайти в папку sis и выполнить команду

makesis aknexform_for_v09.pkg

В папке должен появиться файл с расширением sis (в данном случае это aknexform_for_v09.SIS). Вы можете посмотреть pkg файл, там перечислены файлы, которые нужно добавить в архив, и пути для каждого файла, по которым эти файлы будут установлены на телефоне. Обратите внимание, что в этих путях вместо буквы диска стоит ! – это значит, что все файлы будут ставиться на тот диск, которые пользователь выберет во время инсталляции. 

4. Компиляция для эмулятора под Windows. Зайдите в папку group и выполните команду abld build wins udeb. При попытке компиляции не находится файл mspdb70.dll. Найдите его на диске и пропишите путь в PATH. Внимание! Тут нельзя использовать кавычки в пути, иначе он опять не будет находиться. После того, как вы это сделаете опять произойдет ошибка – не найден файл msobj10.dll. Нужно сделать то же, что и в предыдущем случае. Не забывайте про кавычки! Результат компиляции можно найти в папке %EPOCROOT%\Epoc32\Release\wins\udeb\z\system\apps\AKNEXFORM\. 

5. Запуск эмулятора производится запуском файла %EPOCROOT%\Epoc32\Release\wins\udeb\epoc.exe. Когда запустится эмулятор, ваше приложение будет где-то внизу (используйте джойстик эмулятора).

Дерзайте %)

Создание проекта VisualStudio

Итак, нам необходимо создать из проекта в стиле Symbian, имеющегося в наличии, проект, пригодный для использования с MS VisualStudio. Первым делом необходимо поставить EpocFromMMP (см выше).

 Далее заходим в VS, и создаем новый пустой солюшн File->New->BlankSolution.

 В этом солюшне мы создадим проект. В качестве темплейта нужно выбрать EPOC++ Create New From MMP. Я взял в качестве источника все тот же Forms из стандартных примеров. Должно появится окошко EPOC from MMP. Убедитесь, что в поле Path to Root там стоит то, что надо (у меня там почему-то маячил Quartz). Должно быть %EPOCROOT%\ Epoc32 (%EPOCROOT%\ здесь и везде нужно заменить на то значение, которое он имеет. У меня это например c:\symbian\6.1\Series60, чего и вам желаю. Можете проверить в командной строке, набрав SET EPOCROOT). Далее в Select MMP file нажимаете на browse и выбираете нужный mmp файл. Не забудьте предварительно удалить из него комментарии вида

/*

* =====================================================================

* Name    : AknExForm.mmp

* Part of : AknExForm

* Copyright (c) 2003 Nokia. All rights reserved.

* =====================================================================

*/

Та версия, что есть у меня их не понимает и глючит, если они есть. Еще момент – удалить из INCLUDE и SYSTEMINCLUDE в mmp файле элемент “.”, иначе не скопируются как следует заголовочные файлы. SYSTEMINCLUDE должен содержать %EPOCROOT%\Epoc32\Include. После всего этого можете нажимать Generate и можно попробовать откомпилировать проект. Скорее всего это сразу не получится по той причине, что Epoc from MMP скопировал не все нужные файлы. Например, мне вручную пришлось докопировать aknexform.loc. Возможны еще проблемы с тем, что иногда в исходниках нужно в # include сменить “” на <>.

Если не находит системные заголовочные файлы, то вы идете в свойства проекта, в Configuration Properties -> C++ -> General -> Additional Include Directories. Там должно стоять %EPOCROOT%\Epoc32\Include.

Если не находит системные dll файлы, то вы идете в свойства проекта в Configuration Properties -> General -> Intermediate Directory. Там должно быть %EPOCROOT%\ EPOC32\RELEASE\WINS\UDEB\.

Если и после этого не компилируется (причин может быть множество!) попробуйте спросить тут на форуме – постараюсь ответить.

После компиляции хотелось бы и запустить %) При попытке запустить VS должна спросить, какой программой это сделать. Укажите %EPOCROOT%\EPOC32\RELEASE\WINS\UDEB\EPOC.EXE. Если не спрашивает и не запускает, идете в свойства проекта (а то как же! %) Configuration Properties -> Debugging -> Command и прописываете туда эту строчку.

Чтобы создать свой собственный проект, рекомендую взять тот же HelloWorld из примеров, скопировать его куда-нибудь себе, и на его базе развивать свое приложение. Когда вы поработаете с проектом в VS в нем наверняка появятся новые файлы с исходным кодом и новые библиотеки. Кстати, библиотеку можно добавить в свойствах проекта в Configuration Properties -> Linker -> Input -> Additional Dependencies. Так вот вы захотите это все откомпилировать под реальную платформу. Моя версия EpocFromMMP позволяет компилять только дебаг-версии под Windows эмулятор, так что придется откопировать все ваши файлы обратно по папкам проекта в стиле Symbian, добавить ваши новые файлы в mmp файл и потом компилять с командной строки, как описано выше. При этом используется собственный компилятор (gcc), так что вы можете тут узнать много нового о своем коде %)))

 Удачи %)

Префиксы имен классов (T, C, R, M, H)

При написании кода для платформы Symbian приняты определенные правила именования классов и других структур (рекомендуется ознакомиться с Symbian OS C++ Coding Standards). Вы конечно можете этим правилам не следовать (что не очень-то удобно с точки зрения читабельности кода), но вам все равно придется пользоваться множеством существующих классов, которые этим правилам следуют, так что знать их необходимо. Итак, по порядку. 

Статья написана с использованием материалов сайта NewLC.com

T – этот префикс имеют простые классы, у которых нет конструктора и деструктора, они могут быть объявлены в стеке. Например

TInt i;

TPoint point; 

C – все C-классы являются наследниками CBase и обычно должны быть определены в куче (heap) при помощи оператора new

class CMyClass : public CBase

{

. . .

} 

CMyClass myObject = new (ELeave) CMyClass;

. . .

delete myObject; 

R – такие классы являются промежуточными (proxy) классами, они представляют из себя как бы шлюз, через который вы общаетесь с фактическим объектом, но не на прямую. Обычно такие классы имеют функцию инициализации (Create,Open…) и завершения (Close, Dlete…). Объект R-класса «дееспособен» только между вызовами инициализационной и завершающей функции, если пытаться его использовать не в этом промежутке состояний, вы скорее всего получите аварийное завершение программы с сообщением KERN-EXEC 0. Пример: 

RTimer myTimer;                     // использовать нельзя 

myTimer.CreateLocal();             // можно использовать

. . .

myTimer.Delete();                    // использовать нельзя 

MMixin классы. Очень похожи на интерфейсы языка Java. Это абстрактные классы, содержащие только чисто виртуальные (pure virtual) функции. Класс может наследоваться от нескольких таких интерфейсов, при этом необходимо будет определить методы этих интерфейсов (если конечно ваш класс тоже не является абстрактным). 

H – от Heap, означает, что объект класса объявлен (или находится!) в куче (heap). Например класс HBufC является heap descriptor’ом, объект такого класса сам содержит данные дескриптора и при этом объявлен (или находится) в куче.

Сайт создан в системе uCoz