如何将 ArrayList 从 Java 传递到 android 的 opencv 中的本机端(NDK)

2023-12-02

在Java方面我有

List<Mat> arystrdimages = new ArrayList<Mat>();

随后从外部目录中的文件夹读取的图像被添加到列表中

for(File f : strdimgs)
{       
    Mat tempimg = Highgui.imread(f.getAbsolutePath(), CvType.CV_8UC1);
    arystrdimages.add(tempimg);
}

在本机 jni 端,我想通过引用访问 arystrdimages。

对于单个 Mat 对象,我们可以通过调用getNativeObjAddr方法,即在 Mat 对象的 opencv4android 示例中,本机端的访问如下所示

Java

private Mat mRgba;

调用本机端

CallNative(mRgba.getNativeObjAddr());

在本机端

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_CallNative(JNIEnv *env, jobject thiz, jlong addrRgba1)
{
     Mat& mRgb = *(Mat*)addrRgba1;
}

如何做到这一点List<Mat>对象?

编辑:实施您建议的解决方案

Java端

int elems = arystrdimages.size();
Log.v("Matobjdata", "number of Matobject read = " + elems);
//Log.v("Matobjdata", "from native = " + ans);
long[] tempobjadr = new long[elems]; 
for (int i=0; i<elems; i++)
{
    Mat tempaddr = arystrdimages.elementAt(i);
    tempobjadr[i] = tempaddr.getNativeObjAddr();
}

Log.v("Matobjdata", "addresselementsinlong arrray = " + tempobjadr.length);
int ans = TrainDescriptors(tempobjadr); // Call to native function
Log.v("Matobjdata", "from native = " + ans);

本机端

JNIEXPORT jint JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_TrainDescriptors(JNIEnv *env, jobject trainobject, jlongArray traindataaddr)
{
    vector<Mat> trainimgs;
    jsize a_len = env->GetArrayLength(traindataaddr);
    jlong *traindata = env->GetLongArrayElements(traindataaddr, 0);

    for(int k=0; k<a_len; k++)
    {
        Mat & newimage=*(Mat*)traindata[k];
        trainimgs.push_back(newimage);
    }
    // Do the required manipulation on the images; 
    env->ReleaseLongArrayElements(traindataaddr, traindata, 0);

    return a_len;
}

您可以在 Java 中构建一个长值数组(所有 Mat 的 getNativeObjAddr() 结果)并调用传递该数组的本机函数。

在 JNI 中,您可以使用 GetArrayLength 和 GetLongArrayElements 访问所有 long 值(这将 jlong​​ 返回到第一个元素)。

完成后使用 ReleaseLongArrayElements。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 ArrayList 从 Java 传递到 android 的 opencv 中的本机端(NDK) 的相关文章

随机推荐

  • 如何解析网页

    我试图从 EnviroCanada 天气页面中提取以下内容 我试图按照以下方式获取每小时的数据 时间 大腿 特洛 湿度 7 00 23 23 22 9 22 9 30 提取的 HTML 页面 tr td class text center
  • 如何在 XSLT 中保留元素的开始标记内的空格

    为了避免将敏感信息提交到 SCM 存储库 我编写了一个 XSL 样式表 用于从 ASP NET 中删除连接字符串密码Web config文件 它实现了我删除密码的目标 但它也会影响元素开始标签内的空白 如果可能的话 我想保留这个空白 例如
  • 如何通过 C# 代码更改已过期的 sql server 密码?

    当您使用 SqlConnection 连接到 MS Sql Server 时 如果密码已过期 您将收到 SqlException 编号 18487 或 18488 如何在连接尝试期间更改代码中的用户密码 使用静态SqlConnection
  • 如何允许其他人访问由 Google Apps 脚本制作的网络应用程序?

    我从 Google Apps 脚本部署了一个网络应用程序 但其他人似乎无法运行它 当我登录谷歌时 它运行得很好 我不断得到 要求分享 电子邮件 即使我将源脚本设置为 在网络上公开 执行应用程序 被设定为 用户访问网络应用程序 该应用程序的链
  • Azure Pipelines 第二个作业找不到第一个作业的结果

    我正在开始使用 azure pipelines yml 我想在同一阶段有两份工作 一个用于构建解决方案 另一个用于运行单元测试 问题是第二个作业执行了脚本步骤 但没有找到文件夹Release前一个应该已经创建 trigger master
  • PHP simplexml_load_file 捕获 403

    我正在使用以下 PHP xml simplexml load file request url or die url not loading I use status xml gt Response gt Status gt code 检查
  • Laravel RESTful 控制器参数

    我使用 Laravel 4 和 Angular JS 来使用 RESTful 控制器处理 http 请求 我有一个 RESTful 控制器 UserController具有以下功能 public function getIndex is R
  • 怎样清除手指上的油漆?

    我是 android 新手 我在 Api Demo 中的 FingerPaint java 的帮助下使用手指准备了一个绘画视图 它工作正常 同一个视图包含一个按钮 清除 如果我们单击按钮绘画将被清除 空屏幕和一个按钮 我的问题是如何清除绘画
  • 如何避免Java中的ResultSet已关闭异常?

    一旦我的代码到达我的while rs next 循环它产生ResultSet是关闭异常 是什么原因导致此异常以及如何纠正它 EDIT 我注意到我的代码中正在嵌套while rs next 与另一个循环 rs2 next 两个结果集都来自同一
  • iOS Safari Mobile 不会仅触发一次 pageshow

    iOS Safari 在以下情况下似乎不会触发 pageshow 事件 假设我有 3 页 页面 A 在 pageshow 事件中有一些代码 Page B Page C 用户导航自A gt B 按后退按钮 页面显示触发正常 然后 用户导航到另
  • 如何在 Spring Boot 中获取 DispatcherServeletInitializer 功能

    我们正在寻求将我们的项目迁移到 Spring Boot 但目前尚不清楚如何复制其功能AbstractAnnotationConfigDispatcherServletInitializer在 Spring Boot 中 public cla
  • 如何使用 PHP 更新/编辑 JSON 文件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 这是我的JSON activity code 1 activity name FOOTBALL activity code 2 activity name CRICKET 我需要更新
  • 为什么 JLabels 上的图像图标在运行时会像素化,但在设计模式下却不会?

    左 设计模式 右 运行 每次我运行程序时 图像图标都会变得像素化或模糊 而且我在任何地方都找不到同样的问题 这些图像在设计模式下看起来不错 有谁知道这个问题的解决方案 我正在使用这行代码来获取图像 private Image img hom
  • 如何在Matlab中从矩阵中提取非垂直列

    我有矩阵 A 和向量 b 它指定要为矩阵的每个相应行提取的元素的列索引 例如 A 1 2 3 4 5 6 7 8 9 b 1 3 2 我想要c 1 6 8 关于输出 如何实现这一目标 I tried A b 但它不能按我的需要工作 可能有一
  • Rust 的泛型 FromStr 对象可以做什么?

    Rust s str类有一个parse方法返回一个FromStr目的 parse是模板化的 因此正在解析的类型str可以手动指定 例如 3 parse
  • 在运行时更改已部署应用程序的任务栏图标

    我想更改任务栏图标以在收到新邮件时通知用户 就像 Outlook 收到新邮件时通知用户一样 我已经在网上搜索解决方案 这都是关于更改窗口图标 如下所示 Uri iconUri new Uri Resources envelop ico Ur
  • 为什么for循环要用分号?

    在大多数 C 派生语言 C Java Javascript 等 中 for循环具有相同的基本语法 for int i 0 i lt 100 i code here 为什么此语法包含分号 而分号通常保留用于行尾 另外 为什么后面没有分号i 这
  • 如何检测iPhone中特定声音的声音频率?

    我正在开发一个应用程序 我想检测声音频率 如何检测特定声音 例如狗的声音 的频率 有人有教程或一些示例代码吗 检测单个频率 甚至计算单个 FFT 都不是区分狗吠声与相同音量的其他常见声音的可靠方法 可能有效的方法是使用 MFCC 进行声音指
  • CLR 何时尝试加载引用的程序集?

    我想编写一个小型安装程序应用程序来安装网站并创建 IIS 虚拟目录 该应用程序应在 Windows XP Server 2003 IIS 6 以及 Vista 2008 IIS 7 上运行 问题是 对于 IIS 6 我们通过调用 WMI M
  • 如何将 ArrayList 从 Java 传递到 android 的 opencv 中的本机端(NDK)

    在Java方面我有 List