简介

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。

本地代码与 Java 虚拟机之间是通过 JNI 函数实现相互操作的。JNI 函数通过接口指针来获得,本地方法将 JNI 接口指针当作参数来接受。虚拟机保证在从相同的 Java 线程中对本地方法进行多次调用时,传递给本地方法的接口指针是相同的,本地方法被不同的 Java 线程调用时,它接受不同的 JNI接口指针。

使用JNI和算法进行交互,主要是为了提高算法的性能,最大化的利用机器硬件资源。

JAVA端

1.首先编写native方法
在这里插入图片描述

public class JniJavaTest {
    public static native int jniSum(int x, int y);

    public static native String jniHello(String name);
}

2.执行编译

因为我使用的是java jdk11,所以直接到jdk的目录下进行执行。

D:\Library\jdk-11.0.15\bin>javac E:\090-WORKSPACE\jnitest01\jnitest01\JniJavaTest.java

这样就会生成一个.class文件

在这里插入图片描述

3.生成.h文件,C++编码需要引用的

D:\Library\jdk-11.0.15\bin>javac -h E:\090-WORKSPACE\jnitest01\jnitest01\ E:\090-WORKSPACE\jnitest01\jnitest01\JniJavaTest.java

这样就会在目录下生成一个.h文件

在这里插入图片描述

JniJavaTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniJavaTest */

#ifndef _Included_JniJavaTest
#define _Included_JniJavaTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniJavaTest
 * Method:    jniSum
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_JniJavaTest_jniSum
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     JniJavaTest
 * Method:    jniHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_JniJavaTest_jniHello
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

C++ 端

我这边采用的是Visual Studio 2022

1.创建一个Demo动态库

在这里插入图片描述

名称为JniDll,初始化文件如下:

在这里插入图片描述

2.创建一个类,并把.h文件的内容复制进去

在这里插入图片描述

如果提示无法打开源文件jni.h,主要原因是没有加载jni库。

在VS项目中右键,选择“属性”,在弹出的窗口中选择“VC++ 目录”,然后编辑右侧的“包含目录”

在这里插入图片描述

选择D:\Library\jdk-11.0.15\include和D:\Library\jdk-11.0.15\include\win32

在这里插入图片描述

3.实现.h方法并编译

在这里插入图片描述

Java调用库执行

1.获得当前运行库的位置

public static void main(String[] args) {
    //打印库的位置
    System.out.println(System.getProperty("java.library.path"));
}

在这里插入图片描述

2.把DLL复制进去

在这里插入图片描述

3.执行

/**
 * @author zhe.xiao
 * @date 2023-04-03 20:01
 * @description
 **/
public class JniJavaTest {
    public static native int jniSum(int x, int y);

    public static native String jniHello(String name);

    static {
        System.loadLibrary("JniDll");
    }

    public static void main(String[] args) {
        //打印库的位置
        System.out.println(System.getProperty("java.library.path"));

        int i = JniJavaTest.jniSum(5, 5);
        System.out.println(i);

        String s = JniJavaTest.jniHello("zhexiao");
        System.out.println(s);
    }
}

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐