[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. PHP实现物流查询(通过快递网API实现)

    物流查询实现 引 言:目前快递公司太多了,不可能一个一个去申请api查询.这个时候,就可以通过合作,找一些中间商合作.我试了两家,一家是快递100,一家是快递网. 他们都需要申请key.但是快递100 ...

  2. nodejs安装及环境配置

    简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端Ja ...

  3. libpcap报文解析: ipv4、ipv6 @ 2014.7.2

    #include <string.h> #include <stdlib.h> #include <pcap.h> #include <stdio.h> ...

  4. Android IOS WebRTC 音视频开发总结(十四)-- sip和xmpp异同

    这篇文章主要介绍XMPP与SIP,很多人容易混淆这两个概念,转载请说明出处(博客园RTC.Blacker). 简介:XMPP和SIP都是应用层协议,主要用于互联网上发送语音和即时通讯. SIP在RFC ...

  5. banner淡出效果

    <div class="banner"> <div class="ban"></div> <ul class=&quo ...

  6. 爱之初体验---编译加载内核模块hello

    1. hello.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h ...

  7. 软件工程 speedsnail 第二次冲刺4

    20150521 完成任务:划线第四天,能蜗牛遇到线能反弹,加了障碍物: 遇到问题: 问题1 有一个方向碰到线没有反弹 解决1 没有解决 明日任务: 完善问题1

  8. 安卓手机的touchend事件不触发问题

    问题描述 $(document).on("touchstart touchmove",".btn-highlight",function(event){ $(t ...

  9. php分页代码实例

    $result = "<div class=\"page-num\"><ul class=\"fn-clear\">" ...

  10. 数据结构学习笔记05图(最小生成树 Prim Kruskal)

    最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路   |V|个顶 ...