将 Mats 数组传递给本机代码

2024-03-19

我想要使​​用的本机函数需要一个 7 的数组Mats:

static int nativeCode(cv::Mat &inputImg, cv::Mat bufImgs[7]);

In jni_part I have:

Mat& mRgba = *(Mat*)inRgba;
Mat& bufImgs[7] = *(Mat*)inBufImgs;
nativeCode(mRgba,bufImgs);

在我的 Java 代码中,我声明了我的字段:

private Mat mRgba;
private Mat[] bufImgs = new Mat[7];

我可以打电话getNativeObjAddr on mRgba,但是如何对数组执行等效操作?

一些背景:

我正在使用 OpenCV,用相机进行实时图像处理。我在每个帧上调用的函数都需要一些额外的对象。为了防止每帧创建和销毁这些对象,我想创建它们一次,然后每次都传递引用。


您必须将 Java 对象引用数组转换为本机数组cv::Mat。由于您有一个方法来获取本机对象的地址,所以这非常简单。您在 java 端创建一个本机方法:

public class MyClass {
    private Mat mRgba;
    private Mat[] bufImgs = new Mat[7];

    // set the fields and all...
    // ...

    // Call the native method
    private native int callNativeCode();
}

然后在C/C++端,你实现callNativeCode像这样:

JNIEXPORT jint JNICALL Java_MyClass_callNativeCode(::JNIEnv* env, jobject thisobject)
{
    // Find the required classes
    jclass thisclass = env->GetObjectClass(thisobject);
    jclass matclass = env->FindClass("org/opencv/core/Mat");

    // Get methods and fields
    jmethodID getPtrMethod = env->GetMethodID(matclass, "getNativeObjAddr", "()J");
    jfieldID mrgbafieldid = env->GetFieldID(thisclass, "mRgba", "Lorg/opencv/core/Mat;");
    jfieldID bufimgsfieldid = env->GetFieldID(thisclass, "bufImgs", "[Lorg/opencv/core/Mat;");

    // Let's start: Get the fields
    jobject mrgba = env->GetObjectField(thisobject, mrgbafieldid);
    jobjectArray bufimgsArray = (jobjectArray)env->GetObjectField(thisobject, bufimgsfieldid);

    // Convert the array
    cv::Mat nativeBufImgs[7];
    for (int i = 0; i < 7; i++)
        nativeBufImgs[i] = *(cv::Mat*)env->CallLongMethod(env->GetObjectArrayElement(bufimgsArray, i), getPtrMethod);

    // Get the address for mRgba
    cv::Mat* mrgbaptr = (cv::Mat*)env->CallLongMethod(mrgba, getPtrMethod);

    // We're done! Call the method and return!
    return nativeCode(mrgbaptr, nativeBufImgs);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Mats 数组传递给本机代码 的相关文章

  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • 如何提高加速度计和指南针传感器的精度?

    我正在创建一个增强现实应用程序 当手机面向兴趣点 GPS 位置存储在手机上 时 它可以简单地可视化文本视图 文本视图绘制在屏幕中的兴趣点位置上 它工作正常 问题是指南针和加速度计非常 变体 并且文本视图由于传感器的准确性而不断左右上下移动
  • Spring:当我的类已经用@RestController注释时,为什么我仍然应该使用@RequestBody?

    我目前正在将 Java 和 Spring 用于我的 Web 服务应用程序 我正在使用 RestController希望消除使用注释的需要 ResponseBody and RequestBody注释 不幸的是 删除 RequestBody注
  • 使用 android ndk 独立工具链构建 mono (android ndk r8e)

    我正在尝试使用 android ndk 版本 r8e 中的 ndk 独立工具链构建 mono 但我无法完成构建 我像这样设置我的独立环境 export SYSROOT home jeremybell Desktop android ndk
  • 更新(合并)时缺少 Spring Data JPA 验证

    我正在使用 Spring Boot 1 5 4 RELEASE 和 Spring Data JPA 进行项目 遇到更新实体时未执行 Hibernate 验证器或至少在某些情况下未验证的问题 For Person如下所示 禁止使用空名称 并且
  • 从 MySql 迁移:MariaDB 服务器意外关闭客户端连接

    由于许可 商业使用原因 我们正在从 MySql 迁移到 MariaDB 我们已经成功用 MariaDB 客户端 jar 替换了 MySql 连接器 jar 第一次更改 现在正在尝试用 MariaDB 服务器替换 MySql 服务器而不更改数
  • android:如何将图像添加到相册

    任何人都可以分享代码 或向我指出 Android 示例代码 来帮助我将图像添加到媒体商店 图库 中的相册中 在我的应用程序中 我从服务器下载图像 并使用相机 通过 Intent 拍摄新图像 我想将这些图像组织在特定于应用程序的相册中 类似于
  • Intent.ACTION_DIAL 号码以 # 结尾

    所以我尝试通过以下方式发送号码Intent ACTION DIAL以 结尾 例如 123 但是当Android Dialer应用程序启动时 只有 123 不见了 我正在使用以下代码来触发 Android 的拨号应用程序 Uri number
  • 如何:获取 AVD 的端口号并向其自身发送消息

    我该如何执行以下操作 获取我的 AVD 的端口号 从我的代码而不是命令行 使用步骤 1 中获得的端口号从 AVD 向自身发送消息 这是可能的 模拟器可以给自己发送短信吗 https stackoverflow com questions 8
  • “该选择不能在任何服务器上运行”

    我一直在 Eclipse 中开发一个动态 Web 项目 我收到这个错误 该选择不能在任何服务器上运行 早些时候它工作得很好 但现在我收到了这个错误 我删除了服务器并再次添加 Project gt Right Click gt Propert
  • 如何将 Bundle 转换为 PersistableBundle?

    API21发布了PersistableBundle https developer android com reference android os PersistableBundle html这是系统出于各种目的而保留的捆绑包 JobSc
  • 如何使用放心发送Content-Type表单数据请求?

    我需要使用 Rest Assured 调用表单数据类型 API 这是我的代码 private Map
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • 返回数据集的 kSoap 和 .Net Web 服务

    我知道使用数据集是一个很大的罪恶 但由于该服务不在我的控制之下 并且创建代理服务的前景是不可能的 我想看看是否有人创建了可以使用 kSoap 序列化器反序列化的类结构 或者我是否吸错了东西 同时要启动它 看看是否可行 以下是预期的结果数据
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 将文件夹中结构化的预构建文件集添加到 android out 文件夹

    我为arm编译了glibc 这与Android glibc或bionic C不同 因为我编译的glibc环境将有助于提供更多api 现在我可以在 Android 运行时将 glibc 环境复制到 system 文件夹中 并且在执行 chro
  • Robotium 和系统对话框

    当我尝试与蓝牙设备配对时 会出现带有 PIN 码的系统确认对话框 有 取消 和 确定 按钮 但我无法使用 Robotium 单击它们 如何在 Robotium 中使用 Android 操作系统对话框 谢谢 这对我有用 solo clickO
  • 使用java读取行并映射过滤数据[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions publi
  • 如何使用 GWT 2.4 在服务器端动态创建 UI

    我正在尝试使用 Google Web Toolkit v2 4 创建用户界面 由于多种原因 我需要在运行时指定服务器上接口的内容 我的意思不仅仅是按钮需要动态标签等 而是整个 UI 需要在运行时创建 我的大部分 UI 都可以指定为直接的 H

随机推荐