[Qboy原创]

  2013年12月28日

  在开发一个项目过程中需要调用第三方的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<<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个字节),一切都明白了。

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

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

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

三、接口中的Memory

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

四、int*的处理

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

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

JNA开发中的问题积累的更多相关文章

  1. iOS开发中 workspace 与 static lib 工程的联合使用

    在iOS开发中,其实workspace的使用没有完全发挥出来,最近做了一些研究,也想把之前写过的代码整理下,因为iOS里面的布局方式,交互方式也就那么几种.所以,整理好了之后,更能快捷开发,而且能够形 ...

  2. iOS开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  3. 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  4. 移动Web 开发中的一些前端知识收集汇总

    在开发DeveMobile 与EaseMobile 主题 的时候积累了一些移动Web 开发的前端知识,本着记录总结的目的,特写这篇文章备忘一下. 要说移动Web 开发与传统的PC 端开发,感觉也没什么 ...

  5. WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌

    西川善司的[WITCH CHAPTER 0  cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌   注:日文原文地址: http://pc.watch.impress.co.jp/d ...

  6. iOS开发中你是否遇到这些经验问题

    前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...

  7. 一探前端开发中的JS调试技巧

    前言 调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...

  8. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  9. iOS 开发中你是否遇到这些经验问题(一)

    前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...

随机推荐

  1. Something wrong with FTK OCR

    A case about business secret the suspect took lots of photos and screenshots from BOM, RD papers... ...

  2. 【好文要转】Python:模拟登录以获取新浪微博OAuth的code参数值

    [转自]http://www.tuicool.com/articles/zAz6zi [原文]http://blog.segmentfault.com/hongfei/1190000000343851 ...

  3. 浅谈JavaScript的事件响应

    原文出处: Christian Heilmann   译文出处:Chajn Science 每当猴子们问我JavaScript和DOM里啥东西最牛逼时,我都会一巴掌打回去:卧槽还用问么当然是事件响应了 ...

  4. iOS播放动态GIF图片

    <转> 图片分为静态和动态两种,图片的格式有很多种,在开发中比较常见的是.png和.jpg的静态图片,但有的时候在App中需要播放动态图片,比如.gif格式的小表情头像,在IOS中并没有提 ...

  5. iOS 开发经验谈,点击没响应事件

  6. 利用脚本修改SQL SERVER排序规则

    利用脚本修改SQL SERVER排序规则 编写人:CC阿爸 2014-3-1 l  今年的一项重要工作是对公司所用系统进行繁简的转换,程序转成简体基本很容易解决,但数据库转换成简体,就没那么容易了.经 ...

  7. Html5元素及基本语法

    HTML标签开始标签(opening tag):开放标签结束标签(closing tag):闭合标签 元素定义:HTML元素指的是从开始标签到结束标签的代码(元素以开始标签为起始以借宿标签终止)元素的 ...

  8. thinkphp foreach循环生成二维数组的方法

    先做个问题记录,另外下面是做的过程中遇到的一个没想明白的现象 foreach($result as $key => $val ){ $wzList[$key]['lik']=$val[0]; $ ...

  9. 三种找回 linux root密码

    找回 linux root密码的三种方法 第1种方法: 1.在系统进入单用户状态,直接用passwd root去更改2.用安装光盘引导系统,进行linux rescue状态,将原来/分区挂接上来,作法 ...

  10. C#生成不重复的随机数

    在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数 http://www.jbxue.com/tags/suijishu.h ...