JNI是什么?
Java JNI(Java Native Interface)是一种用于在Java程序中调用本地代码的技术。通俗来说,就是允许Java程序与其他语言(如C、C++)编写的代码进行交互和通信。通过JNI,Java程序可以调用本地代码来实现一些特定的功能,比如访问底层硬件、调用系统级别的API等。这样,Java程序就可以充分利用其他语言的优势,提高性能和灵活性。
为什么要使用?
-
调用本地库:有时候,我们可能需要使用一些特定的本地库或者已经存在的C/C++代码,这些代码可能是为了实现某些特定的功能或者性能优化。
-
访问底层硬件:有些硬件设备的驱动程序可能是用C/C++编写的,通过JNI,我们可以在Java程序中调用这些驱动程序,从而实现对底层硬件的访问和控制。
-
调用系统级别的API:有些系统级别的API只能通过本地代码来调用,通过JNI,我们可以在Java程序中调用这些API,从而实现更底层的操作和控制。
-
性能优化:有些特定的任务,如图像处理、大数据计算等,使用Java可能会导致性能瓶颈。通过JNI,我们可以将这些任务的关键部分用C/C++等高效的语言来实现,从而提高程序的执行效率。
调用示例
环境jdk:1.8
官网文档:java jni
实现步骤
流程图
<1>创建一个TestJNI.java文件,编写带有native方法的TestJNI类,使用javac编译TestJNI.java,生成TestJNI.class文件
<2>javah -jni TestJNI,生成TestJNI.h的头文件
<3>创建TestJNI.c,使用c实现本地方法,通过gcc编译生成TestJNIlib.dll文件
1.创建一个TestJNI.java文件
public class TestJNI {
static {
System.loadLibrary("TestJNIlib"); // 加载名为 TestJNIlib.dll 的动态链接库
}
private native int testJNI(int a,int b);
public static void main(String[] args) {
int sum = new TestJNI().testJNI(6,6);
System.out.println("sum= " + sum);
}
}
打开cmd,javac TestJNI.java
2.生成扩展名为 h 的头文件
javah -jni TestJNI
3.写c语言代码
实现两个数字相加
#include <stdio.h>
#include <jni.h>
#include "TestJNI.h"
JNIEXPORT jint JNICALL Java_TestJNI_testJNI(JNIEnv *env, jobject obj, jint a, jint b) {
printf("Hello, testJNI!\n");
jint result = a + b; // 这里可以根据需要进行具体的操作
return result;
}
编写编译c的脚本gcc-c.bat
@echo off
rem 编译 TestJNI.c 文件
gcc -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o TestJNIlib.dll TestJNI.c
查看是否安装gcc:
安装gcc
1.安装32位
windows10 下 gcc/g++ 的安装_g++下载_altland的博客-优快云博客
2.安装64位
解压,配置环境变量,我这边解压到了e盘:E:\mingw64\bin
cmd,运行 gcc-c.bat
4.执行java文件
java TestJNI
javac TestJNI.java
javah -jni TestJNI
gcc-c.bat
java TestJNI
navice关键字
使用native关键字的方法只有方法的声明,没有具体的实现。具体的实现在本地代码中完成。在运行时,Java虚拟机会通过JNI将Java代码与本地代码进行链接和调用。
大公告成!
参考链接:
Java老手不得不掌握native的用法 (baidu.com)