Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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返回MPI::Request[]类型,并在Java中访问请求的元素_Java_C++_Java Native Interface_Mpi_Return Type - Fatal编程技术网

从JNI返回MPI::Request[]类型,并在Java中访问请求的元素

从JNI返回MPI::Request[]类型,并在Java中访问请求的元素,java,c++,java-native-interface,mpi,return-type,Java,C++,Java Native Interface,Mpi,Return Type,我想从MPC++函数返回一个MPI::Real[]类型,java(通过JNI),然后访问java中的MPI::Real[]数组中的元素。p> JNIEXPORT jobjectArray JNICALL Java_mpiJNI_mpiTEST(JNIEnv *env, jobject obj) { MPI::Request req[8]; return req; // Error: Can't convert req to jobjectArray type } 据我所知,唯一接

我想从MPC++函数返回一个MPI::Real[]类型,java(通过JNI),然后访问java中的MPI::Real[]数组中的元素。p>
JNIEXPORT jobjectArray JNICALL Java_mpiJNI_mpiTEST(JNIEnv *env, jobject obj) {
   MPI::Request req[8];
   return req;  // Error: Can't convert req to jobjectArray type
}
据我所知,唯一接近的返回类型是JobjectArray,但这不起作用。Java不知道什么是MPI::Request[]类型


我不想使用MPJ或MPIJava之类的东西,因为我不知道Java中对未来MPI工作的支持有多大,我希望代码能够在许多集群更新和配置中持久化。如果有人知道更多关于这个问题的信息,我很想听到更多信息。

您需要返回jobjectArray类型的JNI类型。JNI不会为您将该req指针转换为jobjectArray。还要注意java如何布局对象数组和

首先,你在C++堆栈上分配一个数组。这不是持久内存,因此当JNI方法返回时,req指针将是垃圾。因此,如果要保留或分配本机阵列存储,则需要使用“new”分配内存,并具有指向阵列的持久指针

我建议,不是返回和创建对象数组,而是将单个指针值返回到java到请求数组的开始,就像C++中的一样。 为了在Java对象中保留本机指针,典型的技巧是将指针转换为Java“long”原语类型,该原语类型的长度足以在大多数平台上保存实际的本机地址。将返回值“long”存储在java类的as字段中

下次需要访问本机MPI::Request数组时,可以调用本机java方法,并将存储为“long”的地址值传递给它,并将其保存在相应的JNI方法中,将JNI JLon参数转换为指针并将其类型化为MPI::RealEdvReq,这样您就可以成功地在java /jnI方法中创建请求,返回它,并存储在java类中,然后在第二种方法中再次使用它,在C++中,您可以调用C++来创建/发送这些请求等等。 <>最后,由于您动态地为MPI::RES[L]分配了本机内存,请记住在不再需要该数组之后,再使用一个java本地方法,将再次将长值转换为指针并用C++删除语句释放内存。否则,您将出现内存泄漏

下面是我将如何重写您的JNI方法:

JNIEXPORT jlong JNICALL Java_mpiJNI_mpiTEST(JNIEnv *env, jobject obj) {
   MPI::Request *req = new MPI::Request[8]; // Don't forget to release memory leater

   uintptr_t storage = (uintptr_t)ptr

   return (jlong) storage;
}

请告诉我们这与C++有关。java原生代码是用C++编写的。MPI命令来自C++,需要传递给java。这是我的问题的一个非常好的答案!非常感谢你!