windows下java调用JNI简单示例

本文介绍了Java的JNI(JavaNativeInterface)技术,它允许Java与C/C++代码交互,实现本地库调用、硬件访问、系统API调用以及性能优化。通过实例展示了如何在Java中使用JNI,包括创建Java类、生成头文件、编写C代码并编译链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

实现步骤

流程图

<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位

【免费】Mingw64gcc64位资源-优快云文库

解压,配置环境变量,我这边解压到了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)

Guide to JNI (Java Native Interface) | Baeldung

ChatGPT (openai.com)

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'零'Bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值