Привет, хабрадруг!
Коротко о главном: как известно, из С++ кода достаточно вызвать метод 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. Таким образом у нас нет проблем с урл кодировкой.
Возникло желание создать готовую базу с которой можна начинать писать подобного рода приложения. Вот основные примеры/задачи кода::
эта функция передаст в С++ «key=Value&secondKey=secondValue» и там это пропарсится в WebCppProxy::Data::StringDictionary.
Еще примеры не требующие объяснений:
Для лучшего тестирования была создана консоль, которая будет доступна если прописать атрибут debug='true' в теге body
Здесь вожатым выступает класс WebCppProxy::WebProxyForm — это тот же вэб контрол, но в котором осуществляется взаимосвязь с Яваскриптом. Вожатый получает из текущего приложения класс унаследованный от WebCppProxy::ICommandListener и в ходе выполнения вызывает определенные методы.
Чтение файла и проигрывание mp3 происходит за кулисами. Имеются наброски кода для работы с базой данных, но после отсутствия audio я был приятно удивлен, что в Bada реализован localStorage.
Вот, собственно очень кратко описал цель и реализацию, а заготовленный проект можно скачать/посмотреть здесь: Assembla
Код предоставлен только для ознакомления, и не из-за копирайта, а из-за соображения безопасности/стабильности/продуктивности, ведь все еще очень сыро.
Надеюсь помог кому-то в написании приложений для Bada. Хотя используя html5/css/javascript можна их легко портировать под другие платформы и наоборот.
Коротко о главном: как известно, из С++ кода достаточно вызвать метод 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 можна их легко портировать под другие платформы и наоборот.