Pull to refresh

Bada Web-based приложение: Взаимодействия C++ и Javascript

Development of mobile applications
Привет, хабрадруг!

Коротко о главном: как известно, из С++ кода достаточно вызвать метод EvaluateJavascriptN для передачи данных или вызова события. А вот из Яваскрипта вызвать С++ метод пока что не возможно. Для этого нам придется воспользоваться очень уж железным ломом. Но если вам удобнее разрабатывать приложение на html/css/Javascript, но при этом вам нужен доступ к нативному коду и локальным файлам, то вам определенно под кат. Там мы рассмотрим этот ломик подробнее и заготовим себе Project Template для быстрого старта.

Вначале попрошу извинения, за мои пробелы в знании русского языка, но я приложу максимум усилий, что бы текст был без ошибок.

Чуть-чуть лирики


На прошлой неделе получили заказ на разработку множества небольших приложений под Bada. Сам я работаю в вэб областях, но шеф вспомнив мои старые знания в С++ и мой опыт в .NET попросил помочь коллегам, мол вспомнишь/разберешься, а помогать надо — иначе не успеем. И так я получил два первых задания:
  • приложение с десяткой кнопок и проигрывание звуков
  • приложение с некоторыми статьями для чтения

Начало пути


Засучив рукава быстренько скачал Bada SDK. И создавая новой проект меня заинтересовал template «Web-Based Application». В нем создался вэб контрол в который загружался локальный html файл, а поиск в интернете подсказал, что бада располагает -webkit движком и эти факты меня уж очень сильно обрадовали. Но радость моя была поспешной: аудио не проигрывается и получать котент локального файла через ajax нельзя в силу безопасности. Вот здесь то и пришло в голову, что надо как то связать Яваскрипт и С++, таким образом, в первом случае по нажатию кнопки мы пошлем в нативный код соответствующий путь к файлу и оттуда проиграем звук. Ну а во втором, мы пошлем снова же путь к файлу и получим его контент, аля XmlHttpRequest.

А вот и лом


Просмотрев поближе вэб контрол, оказывается, в распоряжении у нас только ILoadingListener. Мельком в коде упоминается более обнадеживающий IWebUiListener. Но у разработчиков пока не дошли руки его привести в исполнение, поэтому вернемся к ILoadingListener. К счастью, он работает так как надо, то-есть если добавим в body iframe или вызовем window.frames.myFrame.location.reload() мы получим в коде события о загрузке. Должен заметить, что атрибут src у iframe мы можем даже не указывать. Ну а теперь здесь все очень просто, меняем hash, делаем iframe reload и получаем в OnLoadingRequested url страницы и соответственно реагируем. Правда, увидев, что вэб контрол имеет метод GetTitle, я остановился на том, что меняю заголовок страницы и получаю его в OnLoadingStarted. Таким образом у нас нет проблем с урл кодировкой.

Украшаем ломик — получаем framework


Возникло желание создать готовую базу с которой можна начинать писать подобного рода приложения. Вот основные примеры/задачи кода::

JavaScript:


bada.sendData({key:'Value',secondKey:'secondValue'});

эта функция передаст в С++ «key=Value&secondKey=secondValue» и там это пропарсится в WebCppProxy::Data::StringDictionary.
Еще примеры не требующие объяснений:
bada.getFile('/Res/help.html',function(responseText){ $('#helpDialog').html(responseText)});<br>bada.playAudio('/Res/sound.mp3');


Для лучшего тестирования была создана консоль, которая будет доступна если прописать атрибут debug='true' в теге body

C++


Здесь вожатым выступает класс WebCppProxy::WebProxyForm — это тот же вэб контрол, но в котором осуществляется взаимосвязь с Яваскриптом. Вожатый получает из текущего приложения класс унаследованный от WebCppProxy::ICommandListener и в ходе выполнения вызывает определенные методы.
virtual void OnCommand(Osp::Base::String command) = 0;<br>virtual void OnCommand(WebCppProxy::Data::StringDictionary* dictionary) = 0;<br>virtual void OnReady() = 0; // ondomready<br>


Чтение файла и проигрывание mp3 происходит за кулисами. Имеются наброски кода для работы с базой данных, но после отсутствия audio я был приятно удивлен, что в Bada реализован localStorage.

Вот, собственно очень кратко описал цель и реализацию, а заготовленный проект можно скачать/посмотреть здесь: Assembla

Код предоставлен только для ознакомления, и не из-за копирайта, а из-за соображения безопасности/стабильности/продуктивности, ведь все еще очень сыро.

Надеюсь помог кому-то в написании приложений для Bada. Хотя используя html5/css/javascript можна их легко портировать под другие платформы и наоборот.
Tags:badajavascript
Hubs: Development of mobile applications
Total votes 2: ↑2 and ↓0 +2
Views2.2K

Popular right now

Middle Mobile Applications Security Engineer
from 3,000 to 4,500 $RoundsecRemote job
Product Manager / Mobile Apps
from 130,000 to 230,000 ₽42TapsRemote job
Experienced Frontend Developer (remote)
from 1,600 to 3,000 $datarocketsRemote job
JavaScript Developer
from 2,700 €DiscoRemote job
Sales Development Representative/ Business development manager
from 80,000 to 120,000 ₽RoonyxRemote job