Маленькая и скромная мобильная внешняя компонента

Изваять простенькую мобильную компоненту на 1С для android не так-то просто. Посему назло отдельным супостатам, не желающим делится исходниками, представляю весь свой скромный труд на публичный суд.

Взявшись за непонятную задачу с почти полным отсутствием примеров можно убить ни один вечер, так ничего не добившись. Особенно когда речь заходит о труднособираемой и еще более трудноотлаживаемой внешней компоненте для мобильной платформы 1С. Кропотливые поиски  все же обязательно приведут к успеху и выдадут на-гора пару ценных ссылок:

Собственно эти ссылки, а особенно вторая (спасибо Игорю Кисилю) послужила источником вдохновения и отправной точкой для настоящей компоненты.

1. Что из интересного в архиве компоненты:

  • Собранный zip с макетом компоненты с примерами вызова обычного метода, а также методы вызова внешнего события через Broadcast (может быть полезно для написания драйверов торгового оборудования);
  • Демо конфигурация.

2. API Компоненты

Список методов:

Delay/Пауза — останавливает выполнение кода на заданное число миллисекунд. Процессор в период простоя не грузится

Параметры:

  • миллисекунд — Число — число миллисекунд на которое нужно остановить выполнение кода.

StartScreenWatch/НачатьОтслеживаниеЭкрана — начинает мониторинг состояния активности экрана устройства. Параметры отсутствуют. Если устройство возвращают из спящего режима блокировки, то вызывается внешнее события со следующими параметрами:

  • Источник — org.ripreal.androidutils
  • Событие — LockChanged

StopScreenWatch/ОстановитьОтслеживаниеЭкрана — прекращает мониторинг активности экрана устройства. Параметры отсутствуют.

Список свойств:

DeviceInfo/ОписаниеУстройства (только чтение) — ID мобильного устройства

3. Как бонус на github:

  • sln проект для VS Studio 2024 и .idea проект (в каталоге android) для Android Studio 3.5
  • Проект .idea настроен на отладку c++ кода компоненты. Инструкция есть в Readme.MD

15 Comments

  1. capitan

    Спасибо. Посмотрим!

    Reply
  2. Pawlick

    Честно говоря из статьи сложно понять природу вещи…

    Чувствуется, что вещь нужная, но… Куча вопросов остается:

    Это компонента для общения 1с с андройд?

    Если да, то только три метода?

    Reply
  3. Region102

    Однозначно нужная статья! А то у меня все никак руки не дойдут до продолжения цикла видео на эту тему.

    Reply
  4. gamletspb

    В описании совершенно не раскрыта задача, которую ставил перед собой автор (если это конечно не написание мобильной внешней компоненты ради мобильной внешней компоненты).

    Reply
  5. ripreal1

    (2) Не ставил цель охватить в этой статье весь жизненный цикл разработки внешней компоненты для мобильного приложения. Я лишь хотел поделится исходниками компоненты, которые можно легко открыть иотлаживать через Visual Studio и Android Studio а также использовать как начальный шаблон для разработки своей компоненты.

    Reply
  6. ripreal1

    (4) С целью угадали. Я просто хотел выложить исходники компоненты, на базе которых легко начать разрабатывать свою компоненту.

    Reply
  7. Xershi

    (6) так на ИТС же есть проект. Вопрос как начать его использовать, а не как его допиливать.

    Reply
  8. ripreal1

    (7) На ИТС есть sln проект только для десктопной версии компоненты. Для мобильной компоненты проекта нет. Есть только исходники и bat-ник для сборки через cmake, который «завести» лично мне не удалось.

    Reply
  9. lokli

    Спасибо за исходник. Возник такой вопрос, а как в третьем примере передать данные в обработку внешних событий 1С?

    У вас, там стоит nullptr…

    Я пытаюсь разобраться на примерах, что бы попробовать свои силы в написании таких компонент.

    Reply
  10. ripreal1

    Этот кусок кода должен помочь:

    extern «C»
    JNIEXPORT void JNICALL
    Java_org_biterp_bcdriver_MainApp_onBarcodeRead(JNIEnv *jenv, jobject thiz, jlong pObject, jstring jdata)
    {
    std::wstring dataWString = Utils::jstring2wstring(jenv, jdata);
    IAddInDefBaseEx* pAddIn = (IAddInDefBaseEx*)pObject;
    if (pAddIn != nullptr) {
    pAddIn->ExternalEvent(s_EventSource, WcharWrapper(L»BarcodeRead»), WcharWrapper(dataWString.data()));
    }
    }
    
    

    Показать

    Reply
  11. lokli

    (10)


    ….

    std::wstring dataWString = Utils::jstring2wstring(jenv, jdata);

    ….

    Спасибо, я вроде в этом направлении и двигался. С преобразованием в строку сильно помогли.

    Теперь глупый вопрос: Utils — это что?

    Reply
  12. ripreal1

    (11) Это отдельный метод

    std::wstring Utils::jstring2wstring(JNIEnv* jenv, jstring aStr)
    {
    std::wstring result;
    
    if (aStr)
    {
    const jchar* pCh = jenv->GetStringChars(aStr, 0);
    jsize len = jenv->GetStringLength(aStr);
    const jchar* temp = pCh;
    while (len > 0)
    {
    result += *(temp++);
    —len;
    }
    jenv->ReleaseStringChars(aStr, pCh);
    }
    return result;
    }
    

    Показать

    Reply
  13. lokli

    (12) Я понял про метод. Вопрос немного в другом. В текущем классе (MainApp) есть этот метод и он объявлен в private. Попытка вызвать его предложенным вами способом

    …
    std::wstring dataWString = MainApp::jstring2wstring(jenv, jdata);
    …

    приводит к ошибкам:

    Ошибка (активно) E0245 нестатическая ссылка не член должна указываться относительно заданного объекта androidUtils

    Ошибка (активно) E0265 функцию «MainApp::jstring2wstring» (объявлено в строке 122) недоступно androidUtils

    Подскажите, пожалуйста, что не так?

    Reply
  14. ripreal1

    (13)

    Это ошибка в синтаксисе из-за незнания C++. Нужно почитать хотя бы пару туториалов. Все равно ведь придется, а без этого компоненту, которая хотя бы что-то умеет кроме слипа не собрать.

    Reply
  15. lokli

    (14) Я нашел решение. Закинул объявление метода в public и сделал следующий вызов:

    MainApp _MainApp;
    std::wstring dataWString = _MainApp.jstring2wstring(jenv, jdata);

    После этого получилось собрать компоненту. Просто был интересен ваш вариант решения этой проблемы. )

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *