Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java jni调用dll


在 Java 中使用 JNI 调用 DLL(Dynamic Link Library)可以实现与底层 C/C++代码的交互。下面我将介绍两种常见的方式来实现这种调用:一种是基于手动加载的方式,另一种是使用 JNA 库来简化 JNI 调用。

手动加载方式

步骤流程

  1. 编写 C/C++代码并生成 DLL 文件。
  2. 编写 Java 代码,使用 JNI 加载 DLL 并调用其中的函数。
  3. 编译 Java 代码。
  4. 运行 Java 程序。

示例代码

C/C++代码(example.c):

#include <stdio.h>

JNIEXPORT void JNICALL Java_com_example_MyClass_printHello(JNIEnv *env, jobject obj) {
    printf("Hello from DLL!\n");
}

Java 代码(MyClass.java):

package com.example;

public class MyClass {
    static {
        System.loadLibrary("example"); // 加载名为example的DLL
    }

    public native void printHello(); // 声明本地方法

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.printHello(); // 调用本地方法
    }
}

编译和运行:

# 编译C代码生成DLL
gcc -shared -o example.dll -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" example.c

# 编译Java代码
javac com/example/MyClass.java

# 运行Java程序
java com.example.MyClass

使用 JNA 库

JNA(Java Native Access)库简化了 JNI 调用,它允许直接在 Java 中调用本地库中的函数,无需手动加载。

步骤流程

  1. 添加 JNA 依赖到项目中。
  2. 编写 Java 接口,声明本地函数。
  3. 使用 JNA 加载并调用本地函数。

Maven 依赖

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.9.0</version>
</dependency>

Gradle 依赖

implementation 'net.java.dev.jna:jna:5.9.0'

示例代码

C/C++代码(example.c) 同上。

Java 代码(MyLibrary.java):

package com.example;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface MyLibrary extends Library {
    MyLibrary INSTANCE = Native.load("example", MyLibrary.class);

    void printHello();
}

public class Main {
    public static void main(String[] args) {
        MyLibrary.INSTANCE.printHello(); // 调用本地方法
    }
}

在这个例子中,MyLibrary 接口声明了需要从本地库中调用的函数,并使用 JNA 的 Native.load 方法加载了本地库。

运行:

# 编译C代码生成DLL(同上)

# 编译Java代码
javac com/example/MyLibrary.java

# 运行Java程序
java com.example.Main

无论选择哪种方式,都需要注意将编译后的 DLL 文件放在 Java 程序能够找到的位置,以便正确加载。

在Java中,JNI(JavaNativeInterface)用于在Java代码中调用本地(Native)代码,通常是C或C++代码。jav ...
在Java中进行异步调用有多种方式,我将为您介绍几种常见的实现方式,包括使用Java原生的方式以及一些常用的第三方库。示例代码:Maven依 ...
在Java中使用gRPC进行调用有几种不同的方式,我会为你介绍其中的两种主要方式:使用原生的gRPC库和使用SpringBoot集成的方式。 ...
在Java中进行异步调用方法有多种方式,我将为您介绍几种常见的实现方式,包括使用原生Java、Java线程池、CompletableFutu ...
###直接调用Python脚本这种方式是最简单直接的方式,可以在Django视图函数中直接调用Python脚本文件。你可以在Django的视 ...