详解JNI JNA!
一、JNI(Java Native Interface)
1.1 JNI简介:
- JNI是Java平台提供的一种编程框架,允许Java代码与C/C++编写的本地库进行交互。
- JNI是属于Java的,与Android无直接关系。
- JNI是Java与C/C++代码间交互的桥梁。
1.2 JNI核心思想:
- 在Java中声明一个Native方法;
- 使用Java命令根据该声明生成一个C/C++头文件;
- 根据头文件,用C/C++实现对应的函数;
- 将C/C++代码编译成动态链接库(Windows的.dll,Linux的.so)。
1.3 JNI与NDK的关系:
- JNI 随着 JDK 先出现——1995年;Android——2012年
- NDK是一个工具集,将JDK的JNI进行了二次封装;
1.4 签名规则:
Java的String类型和C/C++的char类型是不同步的,需要通过JNI来进行转换,(待总结)
二、JNA(Java Native Access)
2.1 JNA简介:
JNA是一个开源的第三方Java库,无需编写JNI(C/C++代码),提供了Java API供使用,快速开发。
2.2 JNA工作流程:
- 将JNA的jar包(jna.jar)添加到项目中。
- 创建一个Java接口,继承 com.sun.jna.Library。
- 在这个接口中声明方法,方法的签名必须与要调用的原生库中的函数签名完全对应(方法名、参数类型、返回值类型)。JNA提供了大量类(如NativeLibrary,Pointer)来映射C的复杂类型(如指针、结构体)。
import com.sun.jna.Library;
import com.sun.jna.Native;public interface CLibrary extends Library {// 加载C标准库,并映射到INSTANCE实例CLibrary INSTANCE = (CLibrary) Native.load("c", CLibrary.class);// 声明方法,直接对应C的printf函数int printf(String format, Object... args);
}
在Java代码中,直接调用接口中声明的方法。
public class HelloJNA {public static void main(String[] args) {int result = CLibrary.INSTANCE.printf("Hello from JNA!\n");System.out.println("Return value: " + result);}
}