热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JNA开发中的问题积累

[Qboy原创]2013年12月28日在开发一个项目过程中需要调用第三方的C的dll。由于是第一次在项目中使用JNA,很多都安装开发文档来做,但是出现了很多的问题。由于

      [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<

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


推荐阅读
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
author-avatar
华女-1_572
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有