JNA技术讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JNI产生背景
• 应用程序需要使用系统相关的功能,而JAVA代码不支持或是难以办到
•
已有其他语言写好的类库或程序,希望JAVA程序可以使用它们JAVA本地接
口的方法
Hale Waihona Puke •出于更高的性能要求,希望使用汇编或者C/C++语言来实现部分功能
JNI的使用步骤
1. 编写JAVA代码。编写一个JAVA类,需要执行三个任务:使用关键字Native 声明将要调用的本机方法;loadLibrary加载包含本机代码的共享库;然后 调用该本机方法 2. 编译JAVA代码。在使用JAVA类之前,必须成功的将它们编译成字节码,即 使用javac命令编译成.class文件 3. 创建C/C++头文件。C/C++头文件将声明想要调用的本机函数说明。使用 javah命令编译.h后缀名结尾的头文件 4. 编写C/C++代码。需要使用C语言编写第三步中源代码文件中的函数。必须
JNA是建立在JNI技术基础之上的一个框架。使用JNI技术,不仅可以实现Java 访问C函数,也可以实现C语言调用Java代码。而JNA只能实现Java访问C函数 ,作为一个Java框架,自然不能实现C语言调用Java代码。此时,你还是需要 使用JNI技术。
JNA动态链接库加载路径研究
• JNA加载动态连接库有一下五种方式
JNA建立与库函数的对应关系
• JNA建立与动态链接库中函数的对应关系,只需在加载了相应类库的接口中声 明这个函数即可 • • • } Public interface CLibrary extends Library{ void printf(String format, Object... args);
JNA基本数据类型对应
Java Type boolean byte char short int long float double
Buffer Pointer
C Type int char wchar_t short int long long, __int64 float double pointer pointer array
导入jni.h文件和步骤三中创建的头文件
JNI的使用步骤
5.创建共享库文件。根据C语言编写的代码利用工具创建共享库文件。
6.运行JAVA程序。把创建的库文件导入后执行代码看是否有效。
JNI的弊端
• • 使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的。 如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外 使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数 据结构,调用已有的 dll/so中公布的函数。 然后再在Java中载入这个适配器dll/so,再编写Java native函数作为dll中 函数的代理。 经过2个繁琐的步骤才能在Java中调用本地代码。
JNA小示例
• 写一个HelloTest类进行测试
• • • • •
public class HelloTest { public static void main(String[] args){ CLibrary.INSTANCE.printf("Hello, World\n"); } }
JNA的不足
JNA小示例
• 在Java项目中引入jna.jar包
•
• • • • •
创建一个Clibrary接口
public interface CLibrary extends Library{ CLibrary INSTANCE = (CLibrary)Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); void printf(String format, Object... args); }
利用JNI编程
JNI回顾
1 2 3 4 JNI简介
JNI设计概述
JNI函数 JNI类型和数据结构
5
调用API函数
JAVA本地接口概述
• 调用JAVA本地方法的时机
• •
JNA简介
• JNA(JAVA Native Access)框架是一个开源的JAVA框架,是SUN公司主导 开发的,建立在经典的JNI的基础上的一个框架,它使您可以方便地使用 java直接访问动态链接库中的函数。 • JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C 的数据类型映射。你不再需要编写C动态链接库。 • 使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。可能速 度会降低几倍。但影响不大。
L/O/G/O
JNA技术讲解
w w w . i n c a . c o m . c n
什么是JNI
• JAVA本地接口(JAVA Native Interface , JNI)。JNI是本地编程接口。它 使得在JAVA虚拟机内部运行的JAVA代码能够与用其他编程语言(如C、C++ 和汇编语言)编写的应用程序和库进行互操作 • 从JAVA1.1开始,JAVA Native Interface标准成为JAVA平台的一部分,它
JNA基本数据类型对应
String
char*
WString
wchar_t*
char** wchar_t** struct* struct
String[]
WString[]
Structure
Union Structure[]
union
struct[]
Callback
NativeMapped NativeLong PointerType
<T> (*fp)()
varies long pointer
NUL-terminated array (native encoding or jna.encoding) NUL-terminated array (unicode) NULL-terminated array of C strings NULL-terminated array of wide C strings pointer to struct (argument or return) (or explicitly) struct by value (member of struct) (or explicitly) same as Structure array of structs, contiguous in memory function pointer (Java or native) depends on definition platform-dependent (32- or 64-bit integer) same as Pointer
JNA技术难点
• 当前路径是在项目下,而不是bin输出目录下。(此处将在后面的具体工程中 解释) • 数据结构的对应关系。(具体数据结构参考JNA文档)
JNA引入动态链接库
• 通过JNA建立与动态链接库的映射很容易,只需创建一个接口,调用Native 的loadLibrary方法即可) • • • • } public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary( “msvcrt”, CLibrary.class);
允许JAVA代码和其他语言写的代码进行交互
• JNI一开始是为了本地已编译诞,尤其是C和C++而设定的。但是它并不妨碍 你使用其他语言,只要调用约定受支持的就可以 • JAVA通过JNI 调用本地方法,而本地方法是以库文件形式存放的。通过调用 本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用 系统的各个接口方法
<T>[] (array of primitive type)
Native Representation 32-bit integer (customizable) 8-bit integer platform-dependent 16-bit integer 32-bit integer 64-bit integer 32-bit floating point 64-bit floating point platform-dependent (32- or 64-bit pointer to memory) 32- or 64-bit pointer to memory (argument/return) contiguous memory (struct member)
1. JAVA工程下
2. 在系统的system32文件夹下
3. JAVA的jdk安装目录的lib文件夹下
4. JAVA的jdk安装目录的jre的bin目录下
5. JAVA的jdk安装目录的bin目录下
JNI简介
1 2 3 4 JNI产生的背景
什么是JNI
JAVA本地接口概述 JAVA本地接口方法
5