• JNI学习2


    简单的ByteBuffer调用和使用MPI交换参数

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

    ByteBuff.java

    View Code
     1 import java.nio.ByteBuffer;
     2 
     3 public class ByteBuff {
     4 
     5     static {
     6         System.loadLibrary("buff");
     7     }
     8 
     9     public native void printBuff(ByteBuffer sbf, ByteBuffer rbf);
    10 
    11     public static void main(String[] args) {
    12         ByteBuffer bf = ByteBuffer.allocateDirect(10);
    13         ByteBuffer rbf = ByteBuffer.allocateDirect(10);
    14         byte bbs[] = "abc".getBytes();
    15         bf.put(bbs);
    16         System.out.println("Before swap " + (char) (rbf).get());
    17         (new ByteBuff()).printBuff(bf, rbf);
    18         System.out.println("Before swap " + (char) (rbf).get());
    19     }
    20 }

    ByteBuff.c

    View Code
     1 #include "ByteBuff.h"
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <mpi.h>
     5 
     6 JNIEXPORT void JNICALL Java_ByteBuff_printBuff (JNIEnv *env, jobject jobj, jobject sbuf,jobject rbuf) {
     7     jbyte* sbufp=(*env)->GetDirectBufferAddress(env,sbuf);
     8     jbyte* rbufp=(*env)->GetDirectBufferAddress(env,rbuf);
     9 
    10     MPI_Request sreq,rreq;
    11     MPI_Status sstatus,rstatus;
    12     MPI_Init(NULL,NULL);
    13     MPI_Isend(sbufp,3,MPI_BYTE,0,0,MPI_COMM_WORLD,&sreq);
    14     MPI_Recv(rbufp,3,MPI_BYTE,0,0,MPI_COMM_WORLD,&rstatus);
    15     MPI_Wait(&sreq,&sstatus);
    16     MPI_Finalize();
    17 
    18     (*env)->ReleasePrimitiveArrayCritical(env,sbuf,sbufp,0);
    19     (*env)->ReleasePrimitiveArrayCritical(env,rbuf,rbufp,0);
    20 }

    编译动态库的时候需要链接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

    执行结果

    1 $ mpiexec -n 1 java -Djava.library.path=. ByteBuff
    2 Before swap 
    3 Before swap b
    xxx
  • 相关阅读:
    友元函数
    异常处理
    RTTI
    接口类
    纯虚函数和抽象类
    虚函数与虚析构函数原理
    查看表空间使用率及shrink 表空间
    RAC fail over 测试
    js判断数组中是不是有某个元素
    layui 表格图片放大
  • 原文地址:https://www.cnblogs.com/valder/p/3012543.html
Copyright © 2020-2023  润新知