JNI(Java Native Interface) 是一种 Java 提供的接口,它允许 Java 代码与使用其他编程语言(例如 C、C++)编写的本地代码(native code)进行交互。通过 JNI,Java 程序可以调用本地(通常是操作系统级的)库函数,反之,本地程序也可以调用 Java 方法。
简而言之,JNI 是 Java 与本地代码交互的桥梁,它使得 Java 程序能够利用操作系统的底层功能或高效的本地库,同时保持跨平台的兼容性。
总结 JNI是JAVA调用本地的方法
**使用场景:**
**JNI 主要用于以下几种场景:**- 性能优化**:**
- 当需要执行计算密集型操作时,某些算法(如图像处理、视频解码、加密算法等)可能在 C/C++ 中执行更高效。使用 JNI 可以调用这些高效的本地实现,而不必重新用 Java 编写整个算法。
- 访问操作系统底层功能**:**
- 某些底层系统功能只能通过本地代码访问,比如操作硬件、与操作系统的特殊 API 交互、访问设备驱动等。
- 调用现有的本地库**:**
- 如果已有用 C 或 C++ 编写的高效本地库,或者需要调用操作系统的特定功能(如网络库、数据库驱动等),可以通过 JNI 将这些本地库与 Java 代码结合使用。
- 实现特定平台的功能**:**
- 在不同的平台上,某些功能只能通过本地代码实现,JNI 使得 Java 程序可以在各个平台上通过本地库调用特定平台的功能。
**JNI 的工作原理:**
1. **Java 调用本地方法****:** - **在 Java 中声明一个本地方法(native method)。这个方法的实现由本地代码提供。** 2. **生成 C/C++ 头文件****:** - **使用 **`**javah**`** 工具(或者通过 IDE)根据 Java 类中的本地方法声明生成 C/C++ 头文件。** 3. **实现本地方法****:** - **在 C/C++ 中实现这些本地方法,并与 Java 代码进行交互。** 4. **编译生成本地库****:** - **将 C/C++ 代码编译成共享库(如 **`**.dll**`**、**`**.so**`** 文件)。** 5. **加载本地库****:** - **在 Java 中使用 **`**System.loadLibrary()**`** 加载本地库,进行调用。**实战案列,本地编写c语言文件编译成dll文件,给Java提供调用。
c语言方法,
#include <windows.h>
// 声明函数作为 DLL 的入口
__declspec(dllexport) void Java_MyClass_showMessage()
{
MessageBox(NULL, "Hello, World!", "Message", MB_OK);
}
**__declspec(dllexport)**
**:这是 Microsoft 编译器的扩展,它指示编译器将该函数导出为 DLL 中的一个可用符号。也就是说,当 DLL 被加载时,其他程序(如 Java)可以访问并调用这个函数。 **
Java_MyClass_showMessage
:这是该函数的名称,符合 JNI 的命名规范。JNI 要求本地方法的名称遵循特定格式:
**Java_**
:固定前缀,表示这是一个 Java 本地方法。**MyClass**
:Java 类名,直接映射到 C 函数名中。**showMessage**
:方法名,直接映射到 C 函数名中。
编译成DDL文件 通过gcc 编译成dll文件
将dll文件赋值到jdk 的bin目录下面去,也可以放在其他的目录
创建Java方法,native声明本地的方法
public class MyClass {
// 声明本地方法
public native void showMessage();
// 加载本地库
static {
System.load("E:\\NJITZX大三上\\学校课程\\TCPIP\\tcpcommunication\\cmmtcp\\src\\HelloWorld.dll");
}
public static void main(String[] args) {
MyClass hello = new MyClass();
hello.showMessage(); // 调用本地方法,弹出消息框
}
}
弹出hello world
需要注意方法名称的编写,特别是c语言名称的编写。
https://www.runoob.com/w3cnote/jni-getting-started-tutorials.html