windows下java调用JNI简单示例

JNI是什么?

Java JNI(Java Native Interface)是一种用于在Java程序中调用本地代码的技术。通俗来说,就是允许Java程序与其他语言(如C、C++)编写的代码进行交互和通信。通过JNI,Java程序可以调用本地代码来实现一些特定的功能,比如访问底层硬件、调用系统级别的API等。这样,Java程序就可以充分利用其他语言的优势,提高性能和灵活性。

为什么要使用?

  1. 调用本地库:有时候,我们可能需要使用一些特定的本地库或者已经存在的C/C++代码这些代码可能是为了实现某些特定的功能或者性能优化

  2. 访问底层硬件:有些硬件设备的驱动程序可能是用C/C++编写的,通过JNI,我们可以在Java程序中调用这些驱动程序,从而实现对底层硬件的访问和控制。

  3. 调用系统级别的API:有些系统级别的API只能通过本地代码来调用,通过JNI,我们可以在Java程序中调用这些API,从而实现更底层的操作和控制。

  4. 性能优化:有些特定的任务,如图像处理、大数据计算等,使用Java可能会导致性能瓶颈。通过JNI,我们可以将这些任务的关键部分用C/C++等高效的语言来实现,从而提高程序的执行效率。

调用示例

环境jdk:1.8

官网文档:java jni

实现步骤

流程图

windows下java调用JNI简单示例_第1张图片 引用: Java筑基 - JNI到底是个啥_Java_码农参上_InfoQ写作社区

<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

windows下java调用JNI简单示例_第2张图片

windows下java调用JNI简单示例_第3张图片

 2.生成扩展名为 h 的头文件

javah -jni TestJNI

 windows下java调用JNI简单示例_第4张图片

 3.写c语言代码

实现两个数字相加

#include 
#include 
#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:

windows下java调用JNI简单示例_第5张图片

安装gcc 

1.安装32位

windows10 下 gcc/g++ 的安装_g++下载_altland的博客-CSDN博客

2.安装64位

【免费】Mingw64gcc64位资源-CSDN文库

解压,配置环境变量,我这边解压到了e盘:E:\mingw64\bin

windows下java调用JNI简单示例_第6张图片

cmd,运行 gcc-c.bat 

windows下java调用JNI简单示例_第7张图片

4.执行java文件

java TestJNI

 windows下java调用JNI简单示例_第8张图片

javac TestJNI.java 

javah -jni TestJNI

gcc-c.bat

java TestJNI

navice关键字 

使用native关键字的方法只有方法的声明没有具体的实现。具体的实现在本地代码中完成。在运行时,Java虚拟机会通过JNI将Java代码与本地代码进行链接和调用。

大公告成! 


参考链接:

Java老手不得不掌握native的用法 (baidu.com)

Guide to JNI (Java Native Interface) | Baeldung

ChatGPT (openai.com)

Java筑基 - JNI到底是个啥_Java_码农参上_InfoQ写作社区

你可能感兴趣的:(java,java,开发语言)