通过JNI调用matlab

 

通过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文件的需要引进的头文件:JAVAjni.hjni_md.h和自己生成的头文件test_pinpu.h;需要引进的matlab库文件:libmx.liblibeng.liblibmat.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文件位置放在jrebin下;

导入DLL文件:static{System.loadLibrary("Matlab7Pinpu");}

调用方法声明: public native static double[] getFuzhi(double[] y);

接着就可以调用相应的方法,至此就完成了java对于Matlab引擎的调用。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值