Господа, стоит задача подключить dll к java программе.
Посмотрел материалы, очевидно надо использовать Java JNI
Сначала компилю файлик SolveLU.java из следующего исходника
| Код |
public class SolveLU { public native int RLU_nn(int n, double a[], double b[], double x[]); static { System.loadLibrary("solve"); } }
|
Затем создаю SolveLU.class с помощью javac.
После этого генерю header file SolveLU.h с помощью javah
| Код | /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class SolveLU */ #ifndef _Included_SolveLU #define _Included_SolveLU #ifdef __cplusplus extern "C" { #endif /* * Class: SolveLU * Method: RLU_nn * Signature: (I[D[D[D)I */ JNIEXPORT jint JNICALL Java_SolveLU_RLU_1nn (JNIEnv *, jobject, jint, jdoubleArray, jdoubleArray, jdoubleArray);
#ifdef __cplusplus } #endif #endif
|
После чего пытаюсь из этого header'a и нижестоящего кода cpp скомпилить dll.
Solve cpp
| Код | #include <jni.h> #include "SolveLU.h" #include <math.h> #define Pii *(p+(i-1)*n+i-1) #define Pij *(p+(i-1)*n+j-1) #define Uki *(u+(k-1)*n+i-1) #define Ukj *(u+(k-1)*n+j-1) #define Uii *(u+(i-1)*n+i-1) #define Uij *(u+(i-1)*n+j-1) int XL(int PrTr, int n, double eps, double *p, double *u); int RXL(int n, double *u, double *b, double *x);
JNIEXPORT jint JNICALL Java_SolveLU_RLU_1nn (JNIEnv *env, jobject obj, jint nn, jdoubleArray a, jdoubleArray b, jdoubleArray x) { int ko=0; int i,n; jdouble tau, u[100];
double *ata = (double*)env->GetDoubleArrayElements(a, 0); double *atb = (double*)env->GetDoubleArrayElements(b, 0); double *dx = (double*)env->GetDoubleArrayElements(x, 0); tau=0.121e-5; ko = XL(1,nn,tau,ata,u); RXL(nn,u,atb,dx); env->ReleaseDoubleArrayElements(x, dx, 0); env->ReleaseDoubleArrayElements(a, atb, 0); env->ReleaseDoubleArrayElements(b, ata, 0); return(ko);
} int XL(int PrTr, int n, double eps, double *p, double *u) { double Vi,Ui,s; int i,j,k,ko; ko=0; if (eps==0.0) eps=0.1e-13; for (i=1;i<=n;i++) { s=0.0; if(i>1) { for (k=1;k<=i-1;k++) { s=s+Uki*Uki; } } Vi=Pii-s; if(fabs(Vi)>eps) { Uii=sqrt(Vi); Ui=1.0/Uii; } else { ko++; Uii=0.0; Ui=0.0; } for (j=i+1;j<=n;j++) { s=0.0; if(i>1) { for (k=1;k<=i-1;k++) { s=s+Uki*Ukj; } } Uij=(Pij-s)*Ui; }
} if(PrTr==1) { for(i=0;i<n;i++) for(j=i;j<n;j++) { u[j*n+i]=u[i*n+j]; } } return(ko); }
int RXL(int n, double *u, double *b, double *x) { int i,j; double y[12],z; for(i=0;i<n;i++) y[i]=0.0; for(i=0;i<n;i++) { z=0.0; if (i>0) { for(j=0;j<i;j++) { z=z+y[j]*(*(u +i*n+j)); } } z=*(b + i) -z; if(u[i*n+i]==0.0) {y[i]=0.0;} else {y[i]=z/(*(u + i*n+i));} } for(i=0;i<n;i++) x[i]=0.0; for(i=n-1;i>=0;i--) { z=0.0; if (i<(n-1)) { for(j=n-1;j>i;j--) { z=z+x[j]*(*(u + i*n+j)); } } z=y[i]-z; if((*(u +i*n+i))==0.0) { *(x +i)=0.0; } else { *(x +i)=z/(*(u + i*n+i)); } } return(0); }
|
В результате компилятор выводит ошибку
fatal error C1010: unexpected end of file while looking for precompiled header directive
Заранее спасибо
|