Я изо всех сил пытаюсь получить доступ к данным, возвращаемым 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()
.
Как это можно сделать?
К сожалению, я не смог найти способ правильно перевести:
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, и вместо этого мне приходится преобразовывать каждый элемент один за другим.