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

Передача JImage в SO-Библиотеку.


Barbanel

Вопрос

Всем здравствуйте, и мое почтение!

Возникла сильная необходимость передать объект 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

 

 

Изменено пользователем Barbanel
убрано несущественное
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
13 часов назад, Slym сказал:

DLIB_JNI_METHOD(jniBitmapExtractFaceGazes)(JNIEnv* env, jobject thiz, jobject bitmap, jobject gazesList)?

Верно, был такой параметр. Я сознательно вырезал его из кода библиотеки и пересобрал библиотеку без этого списка, чтобы локализовать проблему.
Исключение в библиотеке происходит при первой же попытке поработать с объектом bitmap.

Другими словами, отсутствие gazesList не является причиной исключения, в этом я на 146% уверен ?

Ссылка на комментарий
  • 0

Разобрался.

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.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...