You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++Builder 11中处理相机API返回的List<int[]>类型?

在C++Builder 11中处理Android Camera的SupportedPreviewFpsRange数据

问题背景

使用C++Builder 11开发Android应用时,无法正确解析camera_parameters->getSupportedPreviewFpsRange()返回的List<int[]>类型数据。已能正常处理非数组类型的JNI返回值,但对嵌套数组的列表类型封装无头绪。

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

但无法将其中的WrapJNIArray逻辑转换为C++代码,尝试TJavaObjectArray__1<_di_JInteger>未成功。

解决方案

在C++Builder中,可通过JNI对象ID直接构造TJavaArray<Integer>来实现转换,具体代码如下:

// 假设已获取到有效的camera_parameters实例
_di_JCamera_Parameters camera_parameters;
_di_JList list_fps_ranges = camera_parameters->getSupportedPreviewFpsRange();

for (int i = 0; i < list_fps_ranges->size(); ++i)
{
    // 获取列表中的单个int[]对象
    _di_JObject jobject = list_fps_ranges->get(i);
    // 提取JNI层的原始对象ID
    jobject raw_array_obj = static_cast<_di_ILocalObject>(jobject)->GetObjectID();
    
    // 直接用JNI对象ID构造TJavaArray<Integer>,完成封装
    TJavaArray<Integer>* fps_range = new TJavaArray<Integer>(raw_array_obj);
    
    // 访问数组中的帧率范围:[0]是最小帧率,[1]是最大帧率
    int min_fps = fps_range->Items[0];
    int max_fps = fps_range->Items[1];
    
    // 业务逻辑处理...
    
    // 释放内存,避免泄漏
    delete fps_range;
}

关键要点

  • C++Builder没有WrapJNIArray函数,但TJavaArray<T>的构造函数支持直接接收JNI对象ID,用于包装Java数组类型。
  • Java中的int[]对应C++Builder的TJavaArray<Integer>,无需额外嵌套容器。
  • 手动创建的TJavaArray实例必须手动释放,否则会造成内存泄漏。

内容的提问来源于stack exchange,提问作者Tim Beurk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:20:41