从JNI返回MPI::Request[]类型,并在Java中访问请求的元素
我想从MPC++函数返回一个MPI::Real[]类型,java(通过JNI),然后访问java中的MPI::Real[]数组中的元素。p>从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 } 据我所知,唯一接
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。这是我的问题的一个非常好的答案!非常感谢你!