Aufruf eines Fortran-90-Unterprogramms aus Java via c++

Java Hauptprogramm

class JavaSumme {

int n;
double[] X; double[] Y;
double sp;

public JavaSumme(){
  	n=3;
  	X=null;
  	Y=null;
}

public void run(){
  	double[] X = new double[n];
  	double[] Y = new double[n];
  	double[] erg = new double[n];
  	X[0]=4;X[1]=2;X[2]=3;
  	Y[0]=1;Y[1]=6;Y[2]=3;
  	erg=myjavasumme(X, Y);
  	System.out.println("Skalarprodukt:ende");
        System.out.println("nach mysp:0="+erg[0]);
        System.out.println("nach mysp:1="+erg[1]);
        System.out.println("nach mysp:1="+erg[2]);
  	//System.out.println(sp);
}

public static void main(String [] args){
    	JavaSumme meinsp = new JavaSumme();
    	meinsp.run();
}

public  double[]  myjavasumme(double[] x, double[] y){
	//double ssp;
	int dim=x.length;
	double[] erg;
 	erg=summe(x,y,dim);
        System.out.println("nach mysp:dim="+dim);
        System.out.println("nach mysp:0="+erg[0]);
        System.out.println("nach mysp:1="+erg[1]);
	return(erg);
}

static{
//	System.loadLibrary("meinebib");
	System.load("/home/ries/jcppf90summe/libmeinebib.so");
}

public native double[] summe(double[] x, double[] y, int n); 


}

Das c++-Unterprogramm (Interface zu Fortran-90)

#include 
#include "JavaSumme.h"
#include 
#include  // fuer calloc 

extern "C" { void mysp3_(double *x, double *y, jint *n, double *summe);}

//JNIEXPORT void JNICALL
//Java_RufeC_zeigeRufeC(JNIEnv *env, jobject obj){

JNIEXPORT jdoubleArray JNICALL Java_JavaSumme_summe
  (JNIEnv *env, jobject , jdoubleArray X, jdoubleArray Y, jint n){

	jdoubleArray jerg;
	double sp1, sp2;
	double *arrayX, *arrayY;
	double *summe;
	summe=(double*) calloc (n, sizeof(double));
	std::cout << n;
	arrayX=env->GetDoubleArrayElements(X,0);
	arrayY=env->GetDoubleArrayElements(Y,0);
	std::cout << arrayX[0]<< arrayX[1]<< arrayX[2];
	std::cout  <<"x "<< arrayX[0] <<" "<NewDoubleArray(n);
	env->SetDoubleArrayRegion(jerg,0,n,summe);
	return(jerg) ;
}

Das Fortramn-90-Unterprogramm

Da der Fortran-95-Kompiler den Namen des Unterprogramms automatisch um eine "_" verlägert, wird diese Interface-Programm benötigt: Fortran ruft diese Routine tausch, die ihreseits die Paramter 1 zu 1 an das Fortran-Unterprogramm tausch_ weitergibt.
 subroutine mysp3(x,y,n,summe)
 implicit none
 integer n
 double precision :: summe(n)
 double precision :: x(n), y(n)
 integer i
    do i=1, n
      summe(i)=x(i)+y(i)
    end do
    n=n+1
 end subroutine mysp3

Befehle

export .:LD_LIBRARY_PATH=/opt/lib/NAGWare:$LD_LIBRARY_PATH
javac JavaSumme.java
javah JavaSumme
f95 -c mysp3.f90
c++ -shared -o libmeinebib.so -I/usr/lib/jdk1.3.1/include \
     -I/usr/lib/jdk1.3.1/include/linux                    \
     javasumme.cpp mysp3.o -L/opt/lib/NAGWare -lf95       \
java JavaSumme