`

一jna简介

    博客分类:
  • jna
阅读更多

        由于项目中需要用java去调用公司自有sdk库;所以要用到jni;而jni操作非常麻烦,需要定义java接口,生成c的头文件;然后两边适配;开发者不仅要熟悉java语言;对c也要相当熟悉;如果分两个人完成有需要沟通成本;所以需要采用jna框架;仅在java端直接调用dll或者so文件。

 

介绍
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。

JNA工作原理

 

JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。

 

原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。

 

JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现JavaC的数据类型映射。你不再需要编写C动态链接库。

 

当然,这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。可能速度会降低几倍。但影响不大。

 

 

JNA技术难点

 

1,当前路径是在项目下,而不是bin输出目录下。

 

2,数据结构的对应关系

 

 

Java—C和操作系统数据类型的对应表

Java Type

C Type

Native Representation

boolean

int

32-bit integer (customizable)

byte

char

8-bit integer

char

wchar_t

platform-dependent

short

short

16-bit integer

int

int

32-bit integer

long

long long, __int64

64-bit integer

float

float

32-bit floating point

double

double

64-bit floating point

Buffer
Pointer

pointer

platform-dependent (32- or 64-bit pointer to memory)

<T>[] (array of primitive type)

pointer
array

32- or 64-bit pointer to memory (argument/return)
contiguous memory (struct member)

除了上面的类型,JNA还支持常见的数据类型的映射。

String

char*

NUL-terminated array (native encoding or jna.encoding)

WString

wchar_t*

NUL-terminated array (unicode)

String[]

char**

NULL-terminated array of C strings

WString[]

wchar_t**

NULL-terminated array of wide C strings

Structure

struct*
struct

pointer to struct (argument or return) (or explicitly)
struct by value (member of struct) (
or explicitly)

Union

union

same as Structure

Structure[]

struct[]

array of structs, contiguous in memory

Callback

<T> (*fp)()

function pointer (Java or native)

NativeMapped

varies

depends on definition

NativeLong

long

platform-dependent (32- or 64-bit integer)

PointerType

pointer

same as Pointer

 

 

JNA编程过程

 

JNA把一个dll/.so文件看做是一个Java接口。

DllC函数的集合、容器,这正和接口的概念吻合。

 

    我们定义这样一个接口,

public interface TestDll1 extends Library {

                   /**

                    * 当前路径是在项目下,而不是bin输出目录下。

                    */

                   TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);

                   public void say(WString value);

                  

         }

 

 

如果dll是以stdcall方式输出函数,那么就继承StdCallLibrary。否则就继承默认的Library接口。

 

接口内部需要一个公共静态常量:instance

 

TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);

 

通过这个常量,就可以获得这个接口的实例,从而使用接口的方法。也就是调用外部dll的函数!

 

注意:

1Native.loadLibrary()函数有2个参数:

    1dll或者.so文件的名字,但不带后缀名。这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了。

搜索dll的路径是:

1)项目的根路径

2)操作系统的全局路径、

3path指定的路径。

 

2,第二个参数是本接口的Class类型。

 

JNA通过这个Class类型,根据指定的dll/.so文件,动态创建接口的实例。

 

2,接口中你只需要定义你需要的函数或者公共变量,不需要的可以不定义。

public void say(WString value);

 

参数和返回值的类型,应该和dll中的C函数的类型一致。

这是JNA,甚至所有跨平台调用的难点。

 

这里,C语言的函数参数是:wchar_t*

JNA中对应的Java类型是WStirng

  • jna.jar (924.8 KB)
  • 下载次数: 0
分享到:
评论

相关推荐

    JNA实例 JNA实例 JNA实例

    #### 一、JNA简介与应用场景 JNA(Java Native Access)是一种能够让Java程序调用本地库(Native Libraries)的技术,它允许开发人员在不编写JNI(Java Native Interface)代码的情况下访问本地库。JNA通过反射机制...

    Java JNA使用参考手册.pdf

    #### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或本机代码。通过在Java接口中描述目标本...

    android studio 上实现JNA

    1. **JNA简介** - JNA是一种轻量级的框架,通过动态映射本地函数到Java方法,使得Java可以直接调用C/C++等本地库。 - 它通过提供一个接口定义层,使得开发者可以使用Java定义本地函数原型,而无需编写JNI层的复杂...

    jna 小例子

    ### JNA简介 JNA提供了一种方便的机制,使得Java程序可以无缝地访问本地库中的函数和数据结构。它的主要优点是减少了JNI的复杂性,同时也避免了生成和管理C头文件、实现文件以及编译原生代码的过程。 ### 使用JNA...

    开源项目JNA-中文翻译版

    #### 一、简介与背景 **Java Native Access (JNA)** 是一个用于Java应用程序的开源库,它允许开发者无需编写任何C代码就能直接调用本地库。这对于那些希望在Java程序中使用本地平台功能的开发人员来说是一个巨大的...

    jna-platform-4.4.0.jar

    1. JNA简介: Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用本地库(即C和C++编写的动态链接库或静态库)。JNA通过Java接口描述语言(Interface Definition Language, IDL)来定义...

    深入解析JNA—模拟C语言结构体

    #### JNA简介 JNA 是一个Java库,它允许Java程序直接调用本地库而无需编写JNI接口代码。JNA通过反射机制和JNI实现这一功能,使得开发者可以更容易地与本地库进行交互,尤其是在处理C语言编写的动态链接库(DLL)时。 ...

    Jna简单使用

    #### 知识点一:JNA简介与原理 JNA(Java Native Access)是一种允许Java程序直接调用本机DLL或共享库中的函数的框架。它无需编写JNI(Java Native Interface)代码,使得开发人员能够轻松地在Java应用程序中集成...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    【JNA简介】 JNA提供了一种高级接口,它允许Java程序直接映射到本地库的函数和数据结构,无需编写JNI代码。JNA的工作原理是通过映射Java类和方法到本地函数,然后在运行时动态地加载并调用这些函数。JNA库包括了Java...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    1. **JNA简介** JNA 是一个Java库,它允许Java应用程序直接访问本地库中的函数和数据,而无需编写JNI代码或重新编译任何代码。JNA通过映射Java方法到本地函数来实现这一功能,它使用Java对象来传递参数,并自动处理...

    java 使用JNA连接海康的硬盘录像机

    - JNA简介:JNA是一种开源库,允许Java程序直接调用C/C++库的函数,而不需要JNI(Java Native Interface)的复杂过程。 - 基本原理:JNA通过映射原生函数到Java方法来实现调用。它提供了Structure和Pointer等类来...

    开源项目JNA-中文翻译版.pdf

    - **JNA项目简介**:Java Native Access (JNA) 是一个轻量级的Java库,旨在简化开发人员在Java应用程序中调用本地操作系统API的需求。传统上,这种需求通过Java Native Interface (JNI) 来满足,但JNI的使用往往伴随...

    zio-windows:ZIO,JNA,Windows

    ZIO Windows 是一个库,它利用了 ZIO(ZIO,一种强大的、类型安全的、反应式编程库)和 JNA(Java Native Access)技术,使得 Scala 开发者可以方便地在 Windows 操作系统上执行原生函数调用。本文将详细介绍 ZIO ...

    java调用本地化(dll)实用文档

    JNA简介 - **定义**:JNA是一个由SUN公司主导开发的开源框架,基于经典的JNI技术。它提供了与.NET平台上的P/Invoke相似的功能,能够极大地简化调用本地动态链接库(DLL或SO)的过程。 - **优势**:相较于传统的JNI...

    jnaerator-0.12-shaded

    `jnaerator-0.12-shaded`是一个与Java Native Access (JNA) 配合使用的工具,它简化了Java应用程序与C/C++等本地库的交互过程。JNAerator的主要功能是自动生成JNA接口代码,使得Java开发者无需手动编写复杂的JNI...

    纯java获取硬盘序列号

    #### 二、JNA简介 JNA(Java Native Access)是一种用于从Java代码访问本地库的框架。与JNI相比,它不需要编译任何C/C++代码,简化了开发过程。通过JNA,开发者可以轻松地调用操作系统API,比如Windows API中的函数...

    java调用c#写的dll

    **JNA简介** JNA是一个Java库,允许Java代码直接调用本机API,无需编写JNI代码或使用其他工具。JNA通过提供一个接口定义,然后在运行时动态地映射到相应的本机函数。 **步骤1:添加JNA依赖** 要使用JNA,你需要在你...

    ApkIpa.zip

    3. **解压.app**: .app文件其实是一个被归档的目录,可以使用`com.sun.jna`库的`DarwinArchive`来解压。JNA(Java Native Access)允许Java调用C函数,包括处理苹果的归档格式。 4. **查找Info.plist**: 解压后,...

    Android-基于speex的语音录制

    1. **Speex简介**:Speex是由Xiph.Org基金会开发的一种免费、开放源代码的音频编解码器,它针对人类语音进行了优化,提供多种压缩率以适应不同带宽需求。Speex支持VBR(可变比特率)编码,能在保持音质的同时降低...

    eclipse的svn插件(site-1.10.13-1.8.x,site-1.10.13-1.9.x和一个很旧的版本)

    1. **Subversion (SVN) 简介** Subversion 是一个开源的分布式版本控制系统,它允许团队成员协作开发项目,记录文件和目录的更改,以便于回溯、分支和合并代码。这对于多个人共同开发同一项目至关重要。 2. **...

Global site tag (gtag.js) - Google Analytics