java中类的问题!

  在开发一个项目过程中需要调用第三方的C的dll。由于是第一次在项目中使用JNA,很多都安装开发文档来做,但是出现了很多的问题。 由于很多接口还没调完,还不知道接下去有多少问题。先把已经发现的记录下来吧。

  一、long类型

  在其中一个接口中有一个方法如下定义:

  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,接口一样,但是方法实现如下:

  void* CreatePoint(const char* pip,const long port,const char* name){

  cout<

  cout<

  cout<

  }

  最终发现前两个都能正常的输出,而第三个就是死活不行,这就更让我郁闷了,这到底是为什么呢?同样是const char*为什么还有不同的待遇呢,况且把地址输出来之后也是0?后来在公司的璐璐的提醒下,把中间那long类型的参数去掉试试,一发现原来是那个long类型作怪。 但是到底是怎么回事呢?后来在璐璐的提醒下是不是两个开发语言中对long类型的长度定义是不是不一致,把java中的long改成了int来试试,发现在name也输出了。在C中sizeof(long)发现是4个字节,而Long.Size=64(8个字节) int是32位(4个字节),一切都明白了。

  二、自以为是的定义很多Pointer的子类

  由于在c语言中有一个typedef 可以很好的对于类型进行自定义。在这个项目中存在很多的将void *转换成其他比较好记的数据类型,由于对方也没有给了这种类型数据的结构。我第一感觉就是这些类型不太好记,我是不是也定义一些Pointer类型的子类。

  当接口返回一个void*类型时,抛出一个异常,无法将Pointer类型转换成我自己定义的子类,我才明白,我太自以为是了。

  三、接口中的Memory

  由于第一个问题中也用过用Memory来分配空间要记住一下。

  四、int*的处理

  一开始看到这个时候也蒙了一下,JAVA里可是没有指针的啊,怎么传这个,但是在C/C++中传这样的参数好像很正常的。

  后来在com.sum.jnj.ptr包中发现了很多类,比如IntByRefrence。我想int*应该要用这个来传值吧。在这个包中也存在很多其他的类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值