Search code examples
androiddelphijava-native-interfacec++builder

How to wrap List<int[]> with C++Builder 11?


I'm struggling to access the data returned by camera_parameters->getSupportedPreviewFpsRange() with C++Builder 11.

The getSupportedPreviewFpsRange() function is described here: https://developer.android.com/reference/android/hardware/Camera.Parameters#getSupportedPreviewFpsRange()

I don't have any issue with wrapping data which is not an array returned by other functions, but I could not find a way to wrap the List<int[]> data type.

The Delphi way to handle this seems to be:

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>)));

Unfortunately, I could not find a way to properly translate:

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

into C++.

I tried with:

TJavaObjectArray__1<_di_JInteger> 

without any luck, as there is no WrapJNIArray() function.

How could it be done?


Solution

  • Unfortunately, I could not find a way to properly translate:

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

    into C++.

    Try something like this:

    _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>));
    

    I tried with:

    TJavaObjectArray__1<_di_JInteger>
    

    without any luck, as there is no WrapJNIArray() function.

    First, TJavaArray<Integer> translates to TJavaArray__1<int>, not to TJavaObjectArray__1<_di_JInteger>.

    Second, WrapJNIArray() is a helper function declared in <Androidapi.JNIBridge.hpp>.