`
skzr.org
  • 浏览: 366180 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

jna使用心得

    博客分类:
  • J2EE
阅读更多

此文档陆续记录JNA的使用经验!

会根据实际操作陆续更新

 

  1. 带有返回值的字符串形参
    • int lib_ver(unsinged char *buff);
      
      功 能:读取软件版本号
      
      参 数:buff:存放版本号的缓冲区,长度18字节(包括结束字符’\0’)。
      
      返 回:成功则返回 0
      
         例:unsigned char buff[18];
      
                lib_ver(buff);
      
                    printf(“software version is %s”,buff);
      
       
    • JNA JAVA对应方法: int lib_ver(byte[] buf);
    • Java调用方式:
      	public synchronized String version() throws RuntimeException {
      		byte[] buf = new byte[18];
      		machine.lib_ver(buf);
      		return Native.toString(buf);
      	}
        
    • 参考资料:官方解答How to return a out String paramter in the JNA? 
      How do I read back a function's string result?
      
      Suppose you have a function:
      // Returns the number of characters written to the buffer
      int getString(char* buffer, int bufsize);
      The native code is expecting a fixed-size buffer, which it will fill in with the requested data. A Java String is not appropriate here, since Strings are immutable. Nor is a Java StringBuffer, since the native code only fills the buffer and does not change its size. The appropriate argument type would be either byte[], Memory, or an NIO Buffer, with the size of the object passed as the second argument. The method Native.toString(byte[]) may then be used to convert the array of byte into a Java String.

    • 字符串转换指定编码,解决乱码问题:Native.toString(buf, "GBK") 
       

分享到:
评论
10 楼 skzr.org 2013-08-14  
lilyman 写道
在VB中 这个方法的调用方式:
Public Declare Function DR4442Card_ReadType Lib "DR_Soft.dll" (ByRef CType As Integer) As Integer

我在JAVA中 接口的声明:
public int DR4442Card_ReadType(int ctype);

我方法的具体使用:
int ctype = 0;
err = drsoft.DR4442Card_ReadType(ctype);
System.out.prinln(ctype);

控制台输出0.........   - -|||


能够输出就说明正确了吧,一般非0才是失败的。
9 楼 lilyman 2013-08-14  
在VB中 这个方法的调用方式:
Public Declare Function DR4442Card_ReadType Lib "DR_Soft.dll" (ByRef CType As Integer) As Integer

我在JAVA中 接口的声明:
public int DR4442Card_ReadType(int ctype);

我方法的具体使用:
int ctype = 0;
err = drsoft.DR4442Card_ReadType(ctype);
System.out.prinln(ctype);

控制台输出0.........   - -|||
8 楼 lilyman 2013-08-14  
skzr.org 写道

详见:http://skzr-org.iteye.com/blog/763438
我写的一个开发一个dll,然后编写对应的java,然后怎样调试。
jna并不能完全正确处理某些东西,这个时候需要自己绕过。


真心是不太明白 看了之后
我想知道怎么能成功获得type的返回值
虽然知道有点复杂
我用了你当前页面的byte[] 数组的方法
可是不好用返回了一个错乱的字符 并不是编码问题

嗯 DLL我自己编辑不了 同时也不太会JNI语法和做法
只能完全依赖JNA 所以才会如此.................


7 楼 skzr.org 2013-08-14  
lilyman 写道
skzr.org
我来的时候你不在线 我也有类似的问题求教
在开发的时候很让我头疼

我的项目是链接读卡器然后读卡写卡
其中加载了一个第三方DLL  是一个厂商存储格式的DLL

其中有个方法: err = drsoft.DR4442Card_ReadType(type);
err 是这个方法运行返回的状态标识码 0代表运行正确 int类型
type 是一个卡类型的代码  也是带返回值的参数  int 类型

这个方法运行之后我需要获取int类型的type  我应该怎么写完整的代码

我现在很苦恼 每次运行错误就是JVM崩溃的信息......看见了一定要帮帮我 谢谢啦前辈

详见:http://skzr-org.iteye.com/blog/763438
我写的一个开发一个dll,然后编写对应的java,然后怎样调试。
jna并不能完全正确处理某些东西,这个时候需要自己绕过。
6 楼 lilyman 2013-08-14  
skzr.org
我来的时候你不在线 我也有类似的问题求教
在开发的时候很让我头疼

我的项目是链接读卡器然后读卡写卡
其中加载了一个第三方DLL  是一个厂商存储格式的DLL

其中有个方法: err = drsoft.DR4442Card_ReadType(type);
err 是这个方法运行返回的状态标识码 0代表运行正确 int类型
type 是一个卡类型的代码  也是带返回值的参数  int 类型

这个方法运行之后我需要获取int类型的type  我应该怎么写完整的代码

我现在很苦恼 每次运行错误就是JVM崩溃的信息......看见了一定要帮帮我 谢谢啦前辈
5 楼 skzr.org 2011-03-08  
skzr.org 写道
今天发现一个新问题
int rf_select(long devHander, unsigned long snr, unsigned char* size);
这个dll函数一直不成功,vc中调试此dll得出,传入的size==0x00000000C就是null所以一直报错

int rf_select(unsigned char* size);可以正常,下载了最新的源码,准备调试dll中



有些bug的,已经提交jna了,具体代码不太记得了
4 楼 skzr.org 2011-03-08  
chanball 写道
请问这个支持win64吗?

win64未测试
在windows xp 32bit测试过
在ubuntu 10.10 64bit测试过
3 楼 chanball 2011-03-08  
请问这个支持win64吗?
2 楼 skzr.org 2010-09-13  
今天发现一个新问题
int rf_select(long devHander, unsigned long snr, unsigned char* size);
这个dll函数一直不成功,vc中调试此dll得出,传入的size==0x00000000C就是null所以一直报错

int rf_select(unsigned char* size);可以正常,下载了最新的源码,准备调试dll中

1 楼 tlg 2010-09-12  
 
:cry: 那个文档看过好几篇,都没有注意那个细节,你解决一个大问题了

相关推荐

    Java JNA使用参考手册.pdf

    以下是一个简单的JNA使用示例: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** * Simple example of JNA interface mapping and usage. */ public class ...

    JNA使用详解,包括jna.jar 和一个完整的JNA例子

    该资源中,包含jna.jar 和一个jna的函数文档。并且有一个完整的使用例子。该例子是访问本地的IC卡读卡器,其中因为原始厂商提供的本地代码函数过于发杂,为了便于JNA调用,又对本地代码...这是一个很好的JNA使用范例。

    JNA 使用方法

    JNA 使用方法 JNA(Java Native Access)是一种可以让 Java 程序直接调用本地方法的框架,不需要额外的处理或配置,也不需要多余的引用或编码。JNA 框架是 SUN 公司主导开发的,建立在经典的 JNI(Java Native ...

    jna.rar_jna_jna.jar_jna文件

    使用JNA,你可以执行以下操作: 1. 调用操作系统API:比如获取系统信息、文件操作、网络通信等。 2. 与本地库交互:例如,使用OpenCV、OpenGL或其他C/C++库。 3. 操作硬件设备:如读写硬件寄存器或控制GPIO引脚。 4....

    JAVA-JNA简单使用

    JNA使用一个配置文件(通常名为`native.lib`),该文件定义了本地库的函数和数据类型。 2. **安装JNA**:要使用JNA,首先需要将其添加为项目的依赖。如果你使用的是Maven,可以在`pom.xml`文件中添加JNA的依赖项。...

    jna整合包-jna4.5.0+jna4.0.0.rar

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。JNA通过提供一种映射机制,将Java方法与本地库...

    jna调用dll完成demo实例, 超简单

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。本实例将详细介绍如何使用JNA调用DLL动态链接...

    jna-3.3.0 & jna-3.3.0-platform

    JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地简化了在Java应用中使用系统API或DLL库的过程。在这个场景中,我们有两个文件:`jna-3.3.0.jar`和`jna-3.3.0-platform.jar`,它们分别是...

    使用JNA获取窗口句柄,并发送消息

    JNA提供了一种无需编写C代码或使用JNI(Java Native Interface)即可调用操作系统API的方法。本话题将详细介绍如何使用JNA获取窗口句柄并发送消息,以及在CS(Client-Server)架构中实现SSO(Single Sign-On)。 ...

    jna-platform-4.0.0.jar、4.1.0.jar、4.2.0.jar、4.2.1.jar、4.2.2.jar及JNA使用方法、程序示例

    内部包含6个文件,其中五个是最新JNA jar包,包括jna-platform-4.1.0.jar、jna-platform-4.2.0.jar、jna-platform-4.2.1.jar、jna-platform-4.2.2.jar,一个是JNA介绍文档,包括在线帮助、入门示例、简单程序示例等...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    jna&jna-platform4.0版和5.6版本.zip

    对于Java开发者来说,正确选择和使用JNA及jna-platform的版本至关重要。选择版本时,需要考虑以下几个因素: - **项目需求**:根据项目需要调用的本机库和API,确认所需的最低支持版本。 - **兼容性**:确保所选版本...

    JNA实例 JNA实例 JNA实例

    Java源代码部分主要展示了如何使用JNA调用上面定义的C语言函数。关键点如下: 1. **引入依赖库**: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLong; import ...

    JNA-5.7.0 jna-platform-5.7.0

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统功能进行交互,无需编写...通过学习和掌握JNA的使用,开发者可以轻松地将Java应用与各种本地系统服务集成,提升应用的功能性和效率。

    Android通过JNA调用C,C++方法

    本篇文章将详细讲解如何在Android中使用JNA来调用C/C++方法。 首先,了解JNA的基本概念。JNA是一种轻量级的Java库,它允许Java程序直接调用动态链接库(DLL)或共享库(SO)中的函数,无需编写JNI代码。相比之下,...

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态...

    com.sun.jna 3.0.9

    "jna" 指的是Java Native Access,而 "jna-example" 暗示了这个话题将涉及JNA的使用示例,这对于初学者或者需要深入理解JNA功能的人来说非常有价值。 **文件列表解析:** 压缩包中唯一的文件 `jna-3.0.9.jar` 应该...

    JNA调用DLL完整实例demo

    本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数...

    JNA相关包 jna.jar

    描述中的“JNA相关包”进一步确认了我们的焦点在于JNA的使用和功能。JNA的核心思想是通过一个动态库加载器和服务提供者接口(SPI)来实现Java到本地代码的映射。它使用了一个基于类型映射的简单模型,将Java数据类型...

    JNA 4.1.0 官方版

    通过研究源码,开发者可以更好地理解JNA如何处理内存管理、类型转换和错误处理,从而在使用时更加得心应手。 JNA的工作原理是通过动态加载动态链接库(DLL on Windows,.so on Linux,dylib on Mac OS X),并将...

Global site tag (gtag.js) - Google Analytics