如何从 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;
}
现在我该怎么办?
- 将此结构作为参数传递给 java 回调函数
- 我如何 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;
}
希望对你有帮助!!
我想我终于想通了,有两种方法
- 在java中创建一个对象 --> 将它发送到本机代码 --> 填充它
- 在本机代码中创建一个对象 --> 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;
}
它还支持嵌套类型,因此您可以将结构、指针甚至联合作为结构中的字段。
我有两个问题 假设我在 jni 中有一些结构说
struct X
{
Type_A x;
Type_B y;
}
现在我该怎么办?
- 将此结构作为参数传递给 java 回调函数
- 我如何 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;
}
希望对你有帮助!!
我想我终于想通了,有两种方法
- 在java中创建一个对象 --> 将它发送到本机代码 --> 填充它
- 在本机代码中创建一个对象 --> 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;
}
它还支持嵌套类型,因此您可以将结构、指针甚至联合作为结构中的字段。