【JNI 编程】之 HelloJNI 实战

268 阅读1分钟

1、基本概念

JNI(Java Native Interface)是Java提供的一种用于实现Java代码和本地代码(如C/C++)相互调用的技术。通过JNI,我们可以在Java代码中调用本地代码的函数,实现Java与本地代码的互操作。

2、HelloJNI 实战

第1步:创建 HelloJNI.java 文件,并输入以下代码

public class HelloJNI {
    static {
        System.loadLibrary("HelloJNI");
    }

    private native void sayHello();

    public static void main(String[] args){
        new HelloJNI().sayHello();
    }
}

第2步:通过 HelloJNI.java 文件生成 HelloJNI.h 头文件

javac -h . HelloJNI.java

生成的头文件内容如下:

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

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

第 3 步:创建 HelloJNI.c 文件,实现头文件中申明的方法

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *, jobject){
    printf("Hello JIN!\n");
    return 0;
}

编译 HelloJNI.c 文件

gcc -shared -o libHelloJNI.dylib HelloJNI.c

image.png 执行发现报错,提示没有jni.h文件,这是因为在HelloJNI.h头文件中又包含了其他jni.h头文件,jni.h中又包括了jni_md.h头文件,这两个头文件在jdk的安装目录中而不在系统的头文件目录中,gcc不知道去哪里找这两个头文件,所以要在gcc的命令中指定这两个头文件所在的路径,执行的命令改成:

gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" -shared -o libHelloJNI.dylib HelloJNI.c

image.png

注意: 1、这里使用了环境变量 JAVA_HOME,如果没有配置的话,可以使用全路径替换 2、因为我使用的是是 Mac 电脑,所以输出的文件名是 libHelloJNI.dylib 如果是 Windows 电脑,则文件名改为 libHelloJNI.dll 如果是 Linux 电脑,则文件名改为 libHelloJNI.so

第 4 步:执行 class 文件,验证 JNI 调用是否成功

java HelloJNI

image.png

可以看到调用库里面的方法成功了