Как обернуть List<int[]> в C++Builder 11?

Я изо всех сил пытаюсь получить доступ к данным, возвращаемым camera_parameters->getSupportedPreviewFpsRange() с помощью C++Builder 11.

Функция getSupportedPreviewFpsRange() описана здесь: https://developer.android.com/reference/android/hardware/Camera.Parameters#getSupportedPreviewFpsRange()

У меня нет проблем с переносом данных, которые не являются массивом, возвращаемым другими функциями, но я не смог найти способ обернуть тип данных List<int[]>.

Способ Delphi справиться с этим выглядит следующим образом:

camera_parameters: JCamera_Parameters;
pointer: Pointer;
jobject: JObject;
list_fps_ranges: JList;
currentFpsRange, suitableFPSRange: TJavaArray<Integer>;

...

list_fps_ranges := camera_parameters.getSupportedPreviewFpsRange();
jobject := list_fps_ranges.get(I);
pointer := (jobject as ILocalObject).GetObjectID;

fpsRange := TJavaArray<Integer> (WrapJNIArray(pointer, TypeInfo(TJavaArray<Integer>)));

К сожалению, я не смог найти способ правильно перевести:

fpsRange := TJavaArray<Integer> (WrapJNIArray(pointer, TypeInfo(TJavaArray<Integer>)));

в С++.

Я пробовал с:

TJavaObjectArray__1<_di_JInteger> 

без везения, так как нет функции WrapJNIArray().

Как это можно сделать?

0
0
92
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

К сожалению, я не смог найти способ правильно перевести:

fpsRange := TJavaArray<Integer> (WrapJNIArray(pointer, TypeInfo(TJavaArray<Integer>)));

в С++.

Попробуйте что-то вроде этого:

_di_JCamera_Parameters camera_parameters;
TJavaArray__1<int> *currentFpsRange;
TJavaArray__1<int> *suitableFPSRange;

... 

_di_JList list_fps_ranges = camera_parameters->getSupportedPreviewFpsRange();
_di_JObject jobject = list_fps_ranges->get(I);

void *objID = ((_di_ILocalObject)jobject)->GetObjectID();  

// alternatively:
//
// #include <Androidapi.Helpers.hpp>
// void *objID = TAndroidHelper::JObjectToID(jobject);

TJavaArray__1<int> *fpsRange = (TJavaArray__1<int>*) WrapJNIArray(objID, __typeinfo(TJavaArray__1<int>));

Я пробовал с:

TJavaObjectArray__1<_di_JInteger>

без везения, так как нет функции WrapJNIArray().

Во-первых, TJavaArray<Integer> переводится как TJavaArray__1<int>, а не как TJavaObjectArray__1<_di_JInteger>.

Во-вторых, WrapJNIArray() — это вспомогательная функция, объявленная в <Androidapi.JNIBridge.hpp>.

Опубликованный вами пример List<int[] list_fps_ranges работает нормально, но я все еще не понимаю, как правильно использовать WrapJNIArray в случае простого List<Integer>

Я попытался воспроизвести ваше решение с помощью функции getZoomRatios(), которая также является частью Camera.Parameters.

Функция getZoomRatios() возвращает List<Integer>

int n_zoomratios;
void *pointer;
_di_JList list_zoomratios;
        
list_zoomratios= jcamera_parameters->getZoomRatios(); // return List<Integer>
        
_di_JObject jobject= list_zoomratios; //fishy... 
        
pointer= TAndroidHelper::JObjectToID(jobject);
TJavaArray__1<int> *zoomratios = (TJavaArray__1<int>*) WrapJNIArray(pointer, __typeinfo(TJavaArray__1<int>));
                
            

К сожалению, я не могу понять, какие параметры list_zoomratio должны использоваться jobject.

В примере с диапазонами кадров в секунду функция list_preview_fps->get() возвращает JObject, который приписывается jobject, но в случае с list_zoomratios нет очевидного параметра JObject, который я мог бы использовать. Я пробовал много разных способов, но безуспешно.
Как правильно обернуть целочисленный массив? Кстати, есть ли книга/документ, описывающий эти механизмы упаковки? Я не смог найти никакой информации в Интернете по этому вопросу.

спасибо за помощь

Проблема решена таким образом:

        int n_zoomratios;
        int i;

        void *pointer;
        _di_JList list_zoomratios;
        _di_JInteger zoomratio;

        list_zoomratios= jcamera_parameters->getZoomRatios();       // List<Integer>
        n_zoomratios=list_zoomratios->size();

        for(i=0;i<n_zoomratios;i++)
            {
            _di_JObject jobject=list_zoomratios->get(i);
            pointer= TAndroidHelper::JObjectToID(jobject);
            zoomratio = TJInteger::Wrap(pointer);

            sprintf(txt,"%d %d",i,zoomratio->intValue());
            log(txt);
            }

Однако я не могу понять, почему я не могу преобразовать полный массив с помощью WrapJNIArray, и вместо этого мне приходится преобразовывать каждый элемент один за другим.

Другие вопросы по теме