从java运行本机MPI代码

从java运行本机MPI代码,java,java-native-interface,mpi,Java,Java Native Interface,Mpi,我正在尝试从java运行一个简单的本机mpi代码,这是我以后在项目中需要的。我正在使用Ubuntu。 我有: HelloJNI.java public class HelloJNI { static { System.loadLibrary("hello"); } private native void sayHello(); public static void main(String[] args) { new HelloJNI().sayHello(); // i

我正在尝试从java运行一个简单的本机mpi代码,这是我以后在项目中需要的。我正在使用Ubuntu。 我有:

HelloJNI.java

public class HelloJNI {
 static {
   System.loadLibrary("hello");
 }

 private native void sayHello();

 public static void main(String[] args) {
   new HelloJNI().sayHello();  // invoke the native method
 }
}
头文件:

 JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject     thisObj) {
printf("Hello World- MPI from C!\n");
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d"
      " out of %d processors\n",
      processor_name, world_rank, world_size);
MPI_Finalize();
}
C源文件:

 JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject     thisObj) {
printf("Hello World- MPI from C!\n");
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d"
      " out of %d processors\n",
      processor_name, world_rank, world_size);
MPI_Finalize();
}
我遵循了本教程:

我可以通过make文件创建共享库,该文件是:

INCLUDE1 = /usr/lib/java/jdk1.8.0_45/include
INCLUDE2 = /usr/lib/java/jdk1.8.0_45/include/linux
MPI_INCLUDE = /home/openmpi-1.8.5/ompi/include
JAVAHPATH = /usr/lib/java/jdk1.8.0_45/bin
MPICC = /home/openmpi-1.8.5/bin/mpicc
# Define a variable for classpath
CLASS_PATH = ../bin

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

all : libhello.so

# $@ matches the target, $< matches the first dependancy
libhello.so : HelloJNI.o
${MPICC} $< -L/home/openmpi-1.8.5/lib -lmpi -shared -fpic -o $@ -Wl,-   rpath=/home/openmpi-1.8.5/lib 

# $@ matches the target, $< matches the first dependancy
HelloJNI.o : HelloJNI.c HelloJNI.h
${MPICC} -fpic -I$(INCLUDE1) -I$(INCLUDE2) -I$(MPI_INCLUDE) -c $< -o $@

# $* matches the target filename without the extension
HelloJNI.h : HelloJNI.class     
    $(JAVAHPATH)/javah -classpath $(CLASS_PATH) $*


clean :
      rm HelloJNI.h HelloJNI.o libhello.so
到目前为止,我已经从命令行和使用eclipse尝试了各种方法,包括: 使用Eclipse:

  • 在运行配置的VM参数中通过-Djava.library.path添加了共享库路径
    • 也可以通过LD_LIBRARY_路径,如在环境和bashrc中一样
    • 在makefile中,我尝试使用mpicc编译共享库
    • 我还将mpi.jar添加到项目中
使用命令行:

  • javac-cp/home/s3050004/Downloads/openmpi-1.8.5/lib/mpi.jar HelloJNI.java
  • java-Djava.library.path=/home/workspace/HelloJNI/jni:/home/openmpi-1.8.5/lib-cp/home/openmpi-1.8.5/lib/mpi.jar:/home/workspace/HelloJNI/src HelloJNI

在命令行中,我尝试执行与eclipse中相同的操作,eclipse指定共享库的路径,mpi库也指定了mpi.jar,并尝试运行HelloJNI,但我得到了相同的错误。我不知道我为什么会犯这些错误,我想知道我为什么会犯这些错误。我将非常感谢您对此提出的任何建议或想法。

看起来java无法加载libhello.so的所有依赖项

请检查ldd是否可以加载依赖项:

ldd libhello.so
如果没有,

  • 为openmpi库创建符号链接

    ldconfig-n包含openmpi.so文件的文件夹

  • 将该路径添加到LD_LIBRARY_路径

  • 然后再试一次

  • 一旦它开始通过ldd加载,它将从java开始工作。

    它已经修复,OpenMPI有问题,我已经用重新安装和配置了它,并且它工作了:

    --enable-shared --enable-static 
    

    感谢konstantin的回复,我已经修复了它,这是OpenMPI的问题,我已经重新安装并配置了:
    --启用共享--启用静态