Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过JNI设置Java对象的多维数组字段 在我的C++代码中,有一个函数必须返回java对象。使用JNI从Java代码中调用此函数。在返回的对象内部,有一个二维双数组字段,必须在返回对象之前填充该字段。虽然有关于在jobject内设置数组字段的示例代码,但没有明确的方法来设置多维数组字段,无论它们是基元数组还是其他对象数组。究竟是如何做到这一点的?_Java_C++_Multidimensional Array_Java Native Interface_Field - Fatal编程技术网

如何通过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();