在公司项目中遇到这么一个难题
客户有一个基板,这个基板通过数据线可以连接到电脑上,装上驱动就可以调用基板提供的函数.
但是程序是java开发的,所以就需要通过java调用基板函数,但是基板函数允许C++调用不支持java,所以就用到java调用C++
基板函数按照返回值大致分为两种
1.调用后直接返回数字,一般属于命令型函数,比如打开电源,返回0表示打开成功
2.调用后返回数组,比如需要获取采集的数据
第一种类型比较容易,用JNA、JNI都可以实现。因为只返回一个int,java比较容易接收。
第二种返回数组,因为C++有指针,当时机器函数返回的是一个内存地址,这个时候如果直接调用java是无法访问内存地址的。
因此需要转换。
当初也尝试过将返回的数组转为用逗号分割的字符串,但是长度超过300就会类似内存溢出的错误,所以最后放弃这种方式。
重点说一下第二种情况的解决方法
JAVA的代码
public class OASSInterface {
//方法
public native int[] SDFArray(String jsonStr,int[] iarr);
public native int getButtonStatus();
//加载dll
static{
File directory = new File(OASSInterface.class.getResource("/").getPath());
System.load(directory+ "\\Interface.dll");
}
}
//直接调用即可
int[] resultArr = oASSInterface.SDFArray(jsonStr, arr,)