通过JNI调用matlab
http://zhangchaofeng83.blog.163.com/blog/static/4002549720099210362321/
① 生成头文件:依据java文件的声明生成相应的头文件
Java文件:test.pinpu.java
public native static double[] getF(double[] x,double[] y);//求频率
public native static double[] getFuzhi(double[] y);//求幅值
…
H文件:test_pinpu.h
JNIEXPORT jdoubleArray JNICALL Java_test_pinpu_getF
(JNIEnv *, jclass, jdoubleArray, jdoubleArray);
JNIEXPORT jdoubleArray JNICALL Java_test_pinpu_getFuzhi
(JNIEnv *, jclass, jdoubleArray);
…
② 生成DLL文件:在VC下生成DLL文件的需要引进的头文件:JAVA的jni.h,jni_md.h和自己生成的头文件test_pinpu.h;需要引进的matlab库文件:libmx.lib,libeng.lib,libmat.lib
JNIEXPORT jdoubleArray JNICALL Java_test_pinpu_getFuzhi
(JNIEnv *env, jclass, jdoubleArray p){
Engine *ep;
if(!(ep=engOpen(NULL))){AfxMessageBox("不能打开matlabengine");}
jint n=env->GetArrayLength(p);
jdouble *pp=env->GetDoubleArrayElements(p,0);
mxArray *T=NULL;
T=mxCreateDoubleMatrix(1,n,mxREAL);
memcpy((char*)mxGetPr(T),(char*)pp,n*sizeof(double));
engPutVariable(ep,"x",T);
engEvalString(ep,"xk=fft(x)");
engEvalString(ep,"m=abs(xk)");
mxArray *pf=engGetVariable(ep,"m");
int line=mxGetM(pf);
int colum=mxGetN(pf);
double* k = (double*)mxGetPr(pf);
jdoubleArray tg=env->NewDoubleArray(line*colum);
env->SetDoubleArrayRegion(tg,0,line*colum,k);
engClose(ep);
return tg;
}
③ 调用DLL文件:
将生成的Matlab7Pinpu.dll文件位置放在jre的bin下;
导入DLL文件:static{System.loadLibrary("Matlab7Pinpu");};
调用方法声明: public native static double[] getFuzhi(double[] y);
接着就可以调用相应的方法,至此就完成了java对于Matlab引擎的调用。