如何从 jni 将结构作为参数传递给 java 函数或 return 传递给 java

How to pass a structure as an argument to java function or return to java from jni

我有两个问题 假设我在 jni 中有一些结构说

struct X
{
    Type_A x;
    Type_B y;
}

现在我该怎么办?

  1. 将此结构作为参数传递给 java 回调函数
  2. 我如何 return 这个结构到 Java 函数。

如果可以,请举例说明。

您应该使用对象来表示结构。该对象可能是这样的:

public class 结构 {

private Type_A x;
private Type_B y;


public Struct(Type_A x, Type_B y) {
    this.x = x;
    this.y = y;
}


public Type_A getX() {
    return x;
}

public void setX(Type_A x) {
    this.x = x;
}

public Type_B getY() {
    return y;
}

public void setY(Type_B y) {
    this.y = y;
}

}

要使用,您可以调用这样的函数:

myFunction(new Struct(x,y));

和函数 return 像这样的对象:

public Struct myFunction(Struct struct){

   ....
   return struct;
} 

希望对你有帮助!!

我想我终于想通了,有两种方法

  1. 在java中创建一个对象 --> 将它发送到本机代码 --> 填充它
  2. 在本机代码中创建一个对象 --> return 它返回

这两种方法我都做过,效果很好 如果有更好的方法请告诉我....

我担心的是,对于在本机端创建的对象,垃圾回收功能如何????如果您有答案,请在下面发表评论

如果有人遇到类似问题,请在下方评论,以便我可以 post 代码...

如果您将数据结构传递给 Java,这必须是一个 Java 对象。您可以在 JNI 端创建它,也可以填写通过 Java 传递给 JNI 的参数对象。 (例如 Java 可以创建一个 new byte[4096] 并将其传递给 JNI 函数以将结果存储在那里。)

但有时您希望 Java 存储指向本机结构的指针。您将此类指针转换为 int/long 并将其传递给 Java。没有 Java 垃圾收集器会释放此类内存,您必须明确地这样做(如在 C 中)。此外,您将需要调用 JNI 函数来释放此类内存。您可以使用 finalize(),但我建议在可预测的时间从可预测的线程 (!) 中显式释放内存。

Java Native Access 自动处理细节(除了完全避免本机编译步骤)。

public class MyStructure extends com.sun.jna.Structure {
    public int x;
    public int y;
}

它还支持嵌套类型,因此您可以将结构、指针甚至联合作为结构中的字段。