您的位置:首页 > 其它

JNI学习2

2013-04-11 14:41 232 查看
简单的ByteBuffer调用和使用MPI交换参数

程序设计:用ByteBuffer.allocateDirect() 接口分配两个等长的内存空间(addr1和addr2),在JNI中使用GetDirectBufferAddress接口获得两个内存空间的地址,通过MPI的MPI_Isend/MPI_Recv接口,将addr1中的数据传递到addr2中。整个MPI在单进程中执行。

ByteBuff.java

View Code

#include "ByteBuff.h"
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

JNIEXPORT void JNICALL Java_ByteBuff_printBuff (JNIEnv *env, jobject jobj, jobject sbuf,jobject rbuf) {
jbyte* sbufp=(*env)->GetDirectBufferAddress(env,sbuf);
jbyte* rbufp=(*env)->GetDirectBufferAddress(env,rbuf);

MPI_Request sreq,rreq;
MPI_Status sstatus,rstatus;
MPI_Init(NULL,NULL);
MPI_Isend(sbufp,3,MPI_BYTE,0,0,MPI_COMM_WORLD,&sreq);
MPI_Recv(rbufp,3,MPI_BYTE,0,0,MPI_COMM_WORLD,&rstatus);
MPI_Wait(&sreq,&sstatus);
MPI_Finalize();

(*env)->ReleasePrimitiveArrayCritical(env,sbuf,sbufp,0);
(*env)->ReleasePrimitiveArrayCritical(env,rbuf,rbufp,0);
}


编译动态库的时候需要链接MPI的静态库(本文使用MVAPICH 1.8.x),编译命令为

gcc -std=c99 -shared -fPIC -I /usr/local/mvapich/include/ -I /usr/local/jdk1.6.0_30/include/ -I /usr/local/jdk1.6.0_30/include/linux/ -I /usr/local/ ByteBuff.c -o libbuff.so -lpthread /usr/local/mvapich/lib/libmpich.a /usr/local/mvapich/lib/libopa.a /usr/local/mvapich/lib/libmpl.a -lrt -lpthread /usr/local/mvapich/lib/libmpich.a /usr/local/mvapich/lib/libopa.a /usr/local/mvapich/lib/libmpl.a -lrt

执行结果

$ mpiexec -n 1 java -Djava.library.path=. ByteBuff
Before swap
Before swap b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: