matlab分别编译函数成(c、c++)和jar给iosandroid用

    xiaoxiao2022-06-25  183

    最近需要FFT来实现app的一项功能,于是用到了matlab。

    一、编译成jar对应android

    首先,要找到你matlab版本支持的编译器,我的是R2016,能支持的java编译器是jdk1.7,c++使用的是minGW4.9.2(Distributor: TDM-GCC)。

    mingw下载地址

    http://tdm-gcc.tdragon.net/download

    关于对应的版本,https://ww2.mathworks.cn/support/requirements/previous-releases.html

    自行去以上网址里找。

    环境变量的配置我也不过多叙述。

    一个是JAVA_HOME,一个是MW_MINGW64_LOC,分别对应两个编译器安装的目录。

    java安装完设置环境变量就ok,只是c~的要麻烦一些。

    需要在matlab命令行里执行 setenv('MW_MINGW64_LOC','你的编译器路径')

    编译工具是deploytool,命令行执行即可。

    jar的生成非常顺利,但是!c++的发生了很多问题,安装了几个版本的mingw还是没有办法编译,即使找到了编译器也没有办法成功编译。

    多方面寻找,因为我的log里是能看到,已经找到了mingw编译器的,

    ... 正在查找编译器 'MinGW64 Compiler (C++)'... ... 正在查找环境变量 'MW_MINGW64_LOC'...是('C:\TDM-GCC-64')。 ... 正在查找文件 'C:\TDM-GCC-64\bin\g++.exe'...是。 ... 正在查找文件夹 'C:\TDM-GCC-64'...是。 找到已安装的编译器 'MinGW64 Compiler (C++)'。

    ……………………

    未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;请访问 http://www.mathworks.com/help/matlab/matlab_external/install-mingw-support-package.html。如需更多选项,请访问 http://www.mathworks.com/support/compilers/R2016a/win64.html。 Error: An error occurred while shelling out to mbuild (error code = -1). Unable to build executable

     

    所以最后就没有办法,去安装了一个,windows sdk7.1,其实这样算不算换了一个编译器(我也不知道 但是是可行的,win10安装也会出现很多问题其实我觉得网上那些改版本的操作是没有必要的。

    https://www.microsoft.com/en-us/download/details.aspx?id=8442

    我建议,在这个网址下一个镜像,使用setup文件夹的SDKSetup.exe进行安装,不用提供的setup.exe,因为后者会提示NET framework4缺失的问题,这个东西在win10就已经升级到4.6集成在系统里,哪有办法搞出一个来。

    亲测可用,当怎么样设置mingw都没有办法编译成功就试试这个吧。

     

    然后编译出来的jar ,add as library到android studio里非常顺利,方法调用,第一个传入值为int,为传参数量(貌似),第二个object类型,为传入数值。调用方便,成功解决。

     

    二、编译出c++供ios的xcode(OC)调用

    我这边按照deploytool来编译c++非常顺利,但是编译出来是,dll,h,lib格式文件,没有办法给xcode用(貌似),

    所以没有办法,就搞test文件夹里的源文件看能不能写接口。

    但是这个东西,非常的复杂。实话是非必要,非必要,就不要搞了,新的数据类型,mxarray,mwarray,真的会让没接触过过的人一头雾水。搞出来真的很麻烦,如果不是我不会python,我都会编译成python供xcode调用。

    实际上我最后,放弃了这种方法。因为我对指针还不算熟悉,让我搞四个mxarray**,传值和类型转换真的要死

    的好吗!

    最后使用了matlabcoder,这种方法的弊端是不支持一些函数,例如audioread,例如线型滤波函数。

    这样生成的c++函数真的会简单很多,而且非常非常贴心,会给你example,相比让人懵逼的deploytool,matlabcoder真的是程序员福音。也可以自己写简单的接口。

    xcoder那边因为我不是很熟,貌似要把调用的文件后缀改成mm加编译器路径啥的。

    总之还是很好玩的,虽然貌似面临,花了一周搞的这个东西完全没用的后果。


    最新回复(0)