JNA开发中的问题积累

      [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*应该要用这个来传值吧。在这个包中也存在不少其余的类型。

相关文章
相关标签/搜索