通过JNI调用matlab

    技术2022-05-18  13

     

    通过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引擎的调用。

     

     


    最新回复(0)