[Qboy原创]java
2013年12月28日 测试
在开发一个项目过程当中须要调用第三方的C的dll。因为是第一次在项目中使用JNA,不少都安装开发文档来作,可是出现了不少的问题。 因为不少接口还没调完,还不知道接下去有多少问题。先把已经发现的记录下来吧。指针
1、long类型接口
在其中一个接口中有一个方法以下定义:ip
void* CreatePoint(const char* pip,const long port,const char* name);内存
看到这个,我很快的写出了开发
Pointer CreatePoint(String pip,long port,String name);文档
测试报错,错误是Invaild memory access,看了很长的一段时间也没发现本身哪里写错了,虽然也知道是内存地址非法。也试了不少种,好比把String 改成Pointer,改为byte[]但是仍是会报错。最后实在找不到问题缘由了,就本身按照接口用C写了一个dll,接口同样,可是方法实现以下:pip
void* CreatePoint(const char* pip,const long port,const char* name){class
cout<<pip<<endl;
cout<<port<<endl;
cout<<name<<endl;
}
最终发现前两个都能正常的输出,而第三个就是死活不行,这就更让我郁闷了,这究竟是为何呢?一样是const char*为何还有不一样的待遇呢,何况把地址输出来以后也是0?后来在公司的璐璐的提醒下,把中间那long类型的参数去掉试试,一发现原来是那个long类型做怪。 可是究竟是怎么回事呢?后来在璐璐的提醒下是否是两个开发语言中对long类型的长度定义是否是不一致,把java中的long改为了int来试试,发如今name也输出了。在C中sizeof(long)发现是4个字节,而Long.Size=64(8个字节) int是32位(4个字节),一切都明白了。
2、自觉得是的定义不少Pointer的子类
因为在c语言中有一个typedef 能够很好的对于类型进行自定义。在这个项目中存在不少的将void *转换成其余比较好记的数据类型,因为对方也没有给了这种类型数据的结构。我第一感受就是这些类型不太好记,我是否是也定义一些Pointer类型的子类。
当接口返回一个void*类型时,抛出一个异常,没法将Pointer类型转换成我本身定义的子类,我才明白,我太自觉得是了。
3、接口中的Memory
因为第一个问题中也用过用Memory来分配空间要记住一下。
4、int*的处理
一开始看到这个时候也蒙了一下,JAVA里但是没有指针的啊,怎么传这个,可是在C/C++中传这样的参数好像很正常的。
后来在com.sum.jnj.ptr包中发现了不少类,好比IntByRefrence。我想int*应该要用这个来传值吧。在这个包中也存在不少其余的类型。