由于项目中需要用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语言编写的转发器,可以自动实现Java和C的数据类型映射。你不再需要编写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 |
pointer |
platform-dependent (32- or 64-bit pointer to memory) |
|
<T>[] (array of primitive type) |
pointer |
32- or 64-bit pointer to memory (argument/return) |
除了上面的类型,JNA还支持常见的数据类型的映射。 |
||
char* |
NUL-terminated array (native encoding or |
|
wchar_t* |
NUL-terminated array (unicode) |
|
char** |
NULL-terminated array of C strings |
|
wchar_t** |
NULL-terminated array of wide C strings |
|
struct* |
pointer to struct (argument or return) ( |
|
union |
same as |
|
struct[] |
array of structs, contiguous in memory |
|
<T> (*fp)() |
function pointer (Java or native) |
|
varies |
depends on definition |
|
long |
platform-dependent (32- or 64-bit integer) |
|
pointer |
same as |
JNA编程过程
JNA把一个dll/.so文件看做是一个Java接口。
Dll是C函数的集合、容器,这正和接口的概念吻合。
我们定义这样一个接口,
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的函数!
注意:
1,Native.loadLibrary()函数有2个参数:
1,dll或者.so文件的名字,但不带后缀名。这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了。
搜索dll的路径是:
1)项目的根路径
2)操作系统的全局路径、
3)path指定的路径。
2,第二个参数是本接口的Class类型。
JNA通过这个Class类型,根据指定的dll/.so文件,动态创建接口的实例。
2,接口中你只需要定义你需要的函数或者公共变量,不需要的可以不定义。
public void say(WString value);
参数和返回值的类型,应该和dll中的C函数的类型一致。
这是JNA,甚至所有跨平台调用的难点。
这里,C语言的函数参数是:wchar_t*。
JNA中对应的Java类型是WStirng。
相关推荐
#### 一、JNA简介与应用场景 JNA(Java Native Access)是一种能够让Java程序调用本地库(Native Libraries)的技术,它允许开发人员在不编写JNI(Java Native Interface)代码的情况下访问本地库。JNA通过反射机制...
#### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或本机代码。通过在Java接口中描述目标本...
1. **JNA简介** - JNA是一种轻量级的框架,通过动态映射本地函数到Java方法,使得Java可以直接调用C/C++等本地库。 - 它通过提供一个接口定义层,使得开发者可以使用Java定义本地函数原型,而无需编写JNI层的复杂...
### JNA简介 JNA提供了一种方便的机制,使得Java程序可以无缝地访问本地库中的函数和数据结构。它的主要优点是减少了JNI的复杂性,同时也避免了生成和管理C头文件、实现文件以及编译原生代码的过程。 ### 使用JNA...
#### 一、简介与背景 **Java Native Access (JNA)** 是一个用于Java应用程序的开源库,它允许开发者无需编写任何C代码就能直接调用本地库。这对于那些希望在Java程序中使用本地平台功能的开发人员来说是一个巨大的...
1. JNA简介: Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用本地库(即C和C++编写的动态链接库或静态库)。JNA通过Java接口描述语言(Interface Definition Language, IDL)来定义...
#### JNA简介 JNA 是一个Java库,它允许Java程序直接调用本地库而无需编写JNI接口代码。JNA通过反射机制和JNI实现这一功能,使得开发者可以更容易地与本地库进行交互,尤其是在处理C语言编写的动态链接库(DLL)时。 ...
#### 知识点一:JNA简介与原理 JNA(Java Native Access)是一种允许Java程序直接调用本机DLL或共享库中的函数的框架。它无需编写JNI(Java Native Interface)代码,使得开发人员能够轻松地在Java应用程序中集成...
【JNA简介】 JNA提供了一种高级接口,它允许Java程序直接映射到本地库的函数和数据结构,无需编写JNI代码。JNA的工作原理是通过映射Java类和方法到本地函数,然后在运行时动态地加载并调用这些函数。JNA库包括了Java...
1. **JNA简介** JNA 是一个Java库,它允许Java应用程序直接访问本地库中的函数和数据,而无需编写JNI代码或重新编译任何代码。JNA通过映射Java方法到本地函数来实现这一功能,它使用Java对象来传递参数,并自动处理...
- JNA简介:JNA是一种开源库,允许Java程序直接调用C/C++库的函数,而不需要JNI(Java Native Interface)的复杂过程。 - 基本原理:JNA通过映射原生函数到Java方法来实现调用。它提供了Structure和Pointer等类来...
- **JNA项目简介**:Java Native Access (JNA) 是一个轻量级的Java库,旨在简化开发人员在Java应用程序中调用本地操作系统API的需求。传统上,这种需求通过Java Native Interface (JNI) 来满足,但JNI的使用往往伴随...
ZIO Windows 是一个库,它利用了 ZIO(ZIO,一种强大的、类型安全的、反应式编程库)和 JNA(Java Native Access)技术,使得 Scala 开发者可以方便地在 Windows 操作系统上执行原生函数调用。本文将详细介绍 ZIO ...
JNA简介 - **定义**:JNA是一个由SUN公司主导开发的开源框架,基于经典的JNI技术。它提供了与.NET平台上的P/Invoke相似的功能,能够极大地简化调用本地动态链接库(DLL或SO)的过程。 - **优势**:相较于传统的JNI...
`jnaerator-0.12-shaded`是一个与Java Native Access (JNA) 配合使用的工具,它简化了Java应用程序与C/C++等本地库的交互过程。JNAerator的主要功能是自动生成JNA接口代码,使得Java开发者无需手动编写复杂的JNI...
#### 二、JNA简介 JNA(Java Native Access)是一种用于从Java代码访问本地库的框架。与JNI相比,它不需要编译任何C/C++代码,简化了开发过程。通过JNA,开发者可以轻松地调用操作系统API,比如Windows API中的函数...
**JNA简介** JNA是一个Java库,允许Java代码直接调用本机API,无需编写JNI代码或使用其他工具。JNA通过提供一个接口定义,然后在运行时动态地映射到相应的本机函数。 **步骤1:添加JNA依赖** 要使用JNA,你需要在你...
3. **解压.app**: .app文件其实是一个被归档的目录,可以使用`com.sun.jna`库的`DarwinArchive`来解压。JNA(Java Native Access)允许Java调用C函数,包括处理苹果的归档格式。 4. **查找Info.plist**: 解压后,...
1. **Speex简介**:Speex是由Xiph.Org基金会开发的一种免费、开放源代码的音频编解码器,它针对人类语音进行了优化,提供多种压缩率以适应不同带宽需求。Speex支持VBR(可变比特率)编码,能在保持音质的同时降低...
1. **Subversion (SVN) 简介** Subversion 是一个开源的分布式版本控制系统,它允许团队成员协作开发项目,记录文件和目录的更改,以便于回溯、分支和合并代码。这对于多个人共同开发同一项目至关重要。 2. **...