Перейти к содержанию
Fire Monkey от А до Я

Barbanel

Пользователи
  • Постов

    406
  • Зарегистрирован

  • Посещение

  • Победитель дней

    36

Barbanel стал победителем дня 15 августа 2020

Barbanel имел наиболее популярный контент!

Информация о Barbanel

  • День рождения 18.12.1980

Информация

  • Пол
    Мужчина
  • Город
    Bornheim
  • Интересы
    IT, 3D Graphics programming, 3D modellind

Посетители профиля

8 899 просмотров профиля
  1. Поддержу. Тоже разрабатываем кроссплатформенное приложение. Пока все более-менее норм.
  2. Разобрался. function HPEDetect(ABitmap: TBitmap): INT; var lBitmap : jBitmap; libBitmap : JNIObject; begin result := 0; if ( HPELibraryHandle = 0 ) then exit; lBitmap := BitmapToJBitmap(ABitmap); libBitmap := (lBitmap as ILocalObject).GetObjectID; <- ключевой момент здесь result := jniExtractGazes(PEnv, nil, libBitmap); gGazeVect := jniGetGaze(); end; Главная моя ошибка была в том, что я передавал в библиотеку сам JBitmap. Вместо него нужно было передавать JNIObject.
  3. Верно, был такой параметр. Я сознательно вырезал его из кода библиотеки и пересобрал библиотеку без этого списка, чтобы локализовать проблему. Исключение в библиотеке происходит при первой же попытке поработать с объектом bitmap. Другими словами, отсутствие gazesList не является причиной исключения, в этом я на 146% уверен ?
  4. Всем здравствуйте, и мое почтение! Возникла сильная необходимость передать объект JImage в so-библиотеку, написанную на c++ Суть - нужно передать изображение в библиотеку распознавания лиц и ориентации головы. В библиотеке есть функция, объявленная так: jint JNIEXPORT JNICALL DLIB_JNI_METHOD(jniBitmapExtractFaceGazes)(JNIEnv* env, jobject thiz, jobject bitmap) {...} В Delphi я описал эту функцию следующим образом: var jniExtractGazes : function(PVM: PJNIEnv; Reserved: Pointer; bitmap: JObject): INT; cdecl; Гружу/ищу ее так: function HPELoadLibrary: boolean; var lJNIInt : JNIInt; begin Result := False; HPEMode := MODE_ITERATIVE; {$IFDEF ANDROID} HPEDocDir := IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetDocumentsPath); {$ELSE} exit; {$ENDIF} HPELibraryHandle := LoadLibrary(PChar(HPEDocDir + 'libhead_pose_det.so')); if ( HPELibraryHandle = 0 ) then Exit; PEnv := TJNIResolver.GetJNIEnv; PVM := PJavaVM(System.JavaMachine); if HPELibraryHandle <> 0 then begin @OnLoadFunc := GetProcAddress(HPELibraryHandle, 'JNI_OnLoad'); if not Assigned(OnLoadFunc) then begin FreeLibrary(HPELibraryHandle); Exit; end; lJNIInt := OnLoadFunc(PVM, nil); @jniInit := GetProcAddress(HPELibraryHandle, 'Java_com_beraldo_hpe_dlib_HeadPoseDetector_jniInit'); //jniInit @jniDeInit := GetProcAddress(HPELibraryHandle, 'Java_com_beraldo_hpe_dlib_HeadPoseDetector_jniDeInit'); //jniDeInit @jniExtractGazes := GetProcAddress(HPELibraryHandle, 'Java_com_beraldo_hpe_dlib_HeadPoseDetector_jniBitmapExtractFaceGazes'); Result := True; end; end; Адреса всех функций находятся, jniInit и OnLoadFunc отрабатывают корректно. Проблема с функцией jniExtractGazes. function HPEDetect(ABitmap: TBitmap): INT; var lBitmap : jBitmap; begin result := 0; if ( HPELibraryHandle = 0 ) then exit; lBitmap := BitmapToJBitmap(ABitmap); result := jniExtractGazes(PEnv, nil, lBitmap); <===== Project FaceLockClientMobile.apk raised exception class Aborted (6). end; На указанной строке всегда вылетает Exception Aborted. Стек ничего внятного не показывает. Путем долгих проб и ошибок прихожу к подозрению что я неправильно передаю Java-объект в библиотеку. Как его передавать из Дельфи правильно - не могу найти. Буду очень признателен за любые подсказки и догадки. PS речь идет о этой библиотеке: https://github.com/beraldofilippo/android-hpe-library
  5. Не соглашусь. Не обязательно третий мир, скорее как источник опытных кадров. У нас очень похожая ситуация: находимся в Германии, ищем Delphi разработчика, желательно с опытом fmx. Компания небольшая, поэтому гугловских зарплат не предлагаем. Из моего опыта, предлагаемая ЗП соответствует уровню миддл-разработчика. Важно понимать, что речь идет о начальной ЗП, которая пересматривается со временем. Людей просто нет. Не то чтобы им ЗП мала, их (людей) нет. Присылают резюме всякие индусы да турки-арабы-хзкто, это не тот контингенс с которыми мы готовы работать. В итоге плюнули, и везем людей из экс-ссср. На собеседовании тупых вопросов про люки не задавали. Выделили месяц-два для работы в удаленном режиме, чтобы посмотреть как человек справляется, какие вопросы задает, насколько вообще активен. После этого принимаем решение о релокации. PS, друг работает в Голландии, разрабатывают ПО для аэропортов. Его компания за пять лет привезла более тридцати русскоговорящих разработчиков. Имхо, это говорит о многом.
  6. Воу-воу, палехше, на личности не надо переходить. Для этого есть личка.
  7. Ну не из пальца же я его высосал... Очевидно что как минимум он влияет на опции проекта.
  8. Разобрался, возможно проблема проявлялась только у меня. У меня установлен JCL и JVCL. Нужно было в меню Project -> JCL Debug Expert -> Generate .jdbg files выставить Enabled for this project (либо Always enabled) У меня было выставлено Always disabled, отладка не работала. В случае первых двух - отладка под Android64 работает.
  9. Спасибо за ссылку, пробежался бегло - выглядит интересно (несмотря на то, что некоторые вещи уже известны и понятны, о!))) А что думает Ярослав по поводу этой книги?
  10. Добрый день коллеги! Проблема с версией 10.3.3 Возникла необходимость (внезапно, вот неожиданность!))) обновить приложение. Приложение работало в 32битной версии, при компиляции же в 64бита по непонятным причинам не может получить доступ к локальной БД. При попытке отладки приложения брекпоинты не срабатывают, в консоли видна запись: "no debug info". Порывшись в гугле обнаружил ссылку на патч (https://community.idera.com/developer-tools/b/blog/posts/delphi-10-3-3-android-debugging-patch), скачал/установил, но проблема так и не не решилась. Вопрос 1: у кого-нибудь работает отладка под х64? Вопрос 2: может есть размышления по этому поводу? Буду рад любым советам!
  11. <оффтоп> Я конечно дико извиняюсь, но это же просто АГОНЬ!!! решение! Большое спасибо, я лично не знал о таком способе! </оффтоп>
  12. Ну здаров, сталкер! Это нормально для мобильных платформ. Чтобы это обойти придется кидать на Form1 прямоугольник (TRectangle емнип) и присваивать ему полупрозрачную заливку. Соост в центр твоего ректангла кидаешь еще одну непрозрачную панель и уже на ней размещаешь свои контролы. 100%-го аналога ShowModal не получишь, придется логику чуть-чуть поправить. Скорее всего это масштабирование для конкретно твоего устройства, усугубленное тем что ты не используешь Align или Anchors. Используй их и будет тебе счастье. Можно еще почитать про масштабирование чтобы лучше понимать что конкретно происходит. Не сталкивался с таким, не могу сказать. Возможно баг самой FMX, возможно баг в файле стиля (даже не баг, а внутренняя область гроупбокса неправильно описана). Я бы начал проверку со стиля. Есть костыльное решение - установи Margins.Top побольше))))))
  13. Barbanel

    Unable to create process

    Embugcadero?
  14. Большое количество - это сколько? 100, 100 000, 100 000 000? Каждый раз увеличивая размер на один элемент, менеджер памяти ищет непрерывный незанятый кусок памяти такой длины, чтобы уместить все элементы. Хорошо если место под уже выделенный массив позволяет увеличить размер, не упираясь в участики памяти занятые другими данными. Иногда после очередного увеличения массива, уже выделенного участка памяти более не хватает. В таком случае менеджеру приходится искать новый, и копировать старые данные в новый участок памяти, а старый участок помечать как свободный. Разумеется это занимает время. Именно это и приводит к "не так быстро, как хотелось бы". Чтобы избежать этого: 1 Способ курильщика, простой: Увеличиваем размер массива не на 1 элемент, а сразу на 16/32/128/1024 элемента (вам виднее, в зависимости от того сколько у вас может быть элементов в массиве). Также заводим счетчик - номер последнего занятого элемента в массиве, и после каждого добавления - увеличиваем этот счетчик на единицу. Этот способ не избавит от проблемы, но будет приводить к менее частому перераспределению памяти. 2 Способ здорового человека, чуть сложнее: используйте указатели. Заведите массив указателей (либо TList), выделяйте место под каждую новую запись (ваш record) вручную, и помещайте указатель на него в ваш массив указателей (или в TList). Не забывайте освобождать выделенную память, когда ваши обьекты больше не нужны. Этот спобоб более правильный, так как в этом случае перераспределение происходит очень редко. Кстати, реализация TList использует внутри себя первый способ.
×
×
  • Создать...