如何通过JNI设置Java对象的多维数组字段 在我的C++代码中,有一个函数必须返回java对象。使用JNI从Java代码中调用此函数。在返回的对象内部,有一个二维双数组字段,必须在返回对象之前填充该字段。虽然有关于在jobject内设置数组字段的示例代码,但没有明确的方法来设置多维数组字段,无论它们是基元数组还是其他对象数组。究竟是如何做到这一点的?
经过研究,我发现关键在于将多维数组字段视为作业对象数组。在本例中,这些作业对象实际上是双精度数组。可以根据需要在任意多个维度上继续此操作。包含相关多维数组字段的对象是:如何通过JNI设置Java对象的多维数组字段 在我的C++代码中,有一个函数必须返回java对象。使用JNI从Java代码中调用此函数。在返回的对象内部,有一个二维双数组字段,必须在返回对象之前填充该字段。虽然有关于在jobject内设置数组字段的示例代码,但没有明确的方法来设置多维数组字段,无论它们是基元数组还是其他对象数组。究竟是如何做到这一点的?,java,c++,multidimensional-array,java-native-interface,field,Java,C++,Multidimensional Array,Java Native Interface,Field,经过研究,我发现关键在于将多维数组字段视为作业对象数组。在本例中,这些作业对象实际上是双精度数组。可以根据需要在任意多个维度上继续此操作。包含相关多维数组字段的对象是: package com.example; public class ObjectTransform{ public String name; public double[][] transform; public ObjectTransform(){ name = "";
package com.example;
public class ObjectTransform{
public String name;
public double[][] transform;
public ObjectTransform(){
name = "";
transform = new double[4][4];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
transform[i][j] = i == j ? 1 : 0;
}
}
可以像往常一样,使用以下签名从Java内部调用本机函数:
package com.example;
...
private native ObjectTransform examplefunction();
从这里开始,设置任意对象的多维数组字段非常简单:与其使用[[D
,不如使用write[[com.example.exampleclass;
。调用NewObjectArray
而不是NewDoubleArray
。而不是SetDoubleArrayRegion
,通过SetObjectArrayElement
将对象数组的所有元素分别设置为预先创建的对象
当然欢迎对这段代码的所有改进。需要为每个j删除jrow。还有为什么选择reinterpret_cast?
package com.example;
...
private native ObjectTransform examplefunction();