【问题标题】:JNI -- It is possible to pass complex type as native method parameters?JNI——可以将复杂类型作为本机方法参数传递吗?
【发布时间】:2013-11-24 17:51:24
【问题描述】:

我见过的大多数使用 JNI 的示例将主要类型的参数传递给可以根据 this 轻松映射的本机方法

我的问题是关于复杂类型,例如 java 对象,是否可以将其作为本机方法参数传递?以及如何在 c++ 端使用它?

【问题讨论】:

  • 你已经知道了:每个本地方法实现都传递了一个jclass,如果不是静态的,则传递一个jobject。本机方法中的显式参数的工作方式相同。
  • 使用 java Mat getNativeObjAddr() 方法将 Mat 对象作为“long”传递给本机代码:阅读该问题:stackoverflow.com/questions/20193039/…

标签: java c++ java-native-interface


【解决方案1】:

当然可以访问对象。 JNI spec 在章节中很好地描述了这些原则

  • 引用 Java 对象
  • 访问字段和方法

基本摘录是这样的:

JNI 确实为您的类提供 C++ 对应项。 每个对象类型作为不透明的jobject(或“jstring”或“jarray”等)传递给C代码。

JNI 为您提供了一些实用程序,可以从这些jobjects 中提取其他元信息,例如字段和方法的 id。 GetIntField 是其中一种实用方法。

当您拥有字段 ID 时,您可以使用 SetIntField 等方法设置字段的值或使用 SetIntFieldGetIntField 检索它。

这当然只是一个粗略的大纲。

【讨论】:

  • 我尝试像这样public void native method ( Mat mat) 传递一个Mat 的opencv 类型,但是当我运行javah 命令生成头文件时,我收到错误cannot find Mat
  • @nawara 你查看了链接的规范吗?
  • 是的,我明白这一点,可能在我的情况下,我应该寻找一种方法来复制我的 Mat 类型变量的值,该变量作为 C++ 函数使用的本机方法的参数传递Mat 主要是 C++ 类型
  • @nawara:你说Mat不是Java类型而是C++类型?如果是这样,那么我不理解您最初的问题,因为那是关于将 Java 对象作为 JNI 方法的参数。
  • Mat 最初是一种称为 OpenCV 库的 C++ 类型,它现在支持桌面 JAVA,因此我可以在添加 1) opencv jar 2) opencv native library (.so) 后在 java 程序中使用 Mat 类型的变量,我会将Mattype的参数传递给java端的native方法并在C++端使用
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多