Java Native Interface JDK8 JNI 示例
使用Java Native Interface (JNI)可以让Java程序调用本地(C/C++)代码。以下是一个示例,通过创建一个简单的JNI应用程序来演示如何使用JNI在JDK8
中调用本地代码。
1. 创建Java类
首先,创建一个Java类,声明一个本地方法。
public class HelloWorld {
// 声明一个本地方法
public native void printHelloWorld();
static {
// 加载本地库
System.loadLibrary("HelloWorld");
}
public static void main(String[] args) {
new HelloWorld().printHelloWorld();
}
}
2. 生成C/C++头文件
编译Java类并生成对应的C/C++头文件。
# 编译Java类
javac HelloWorld.java
# 生成C/C++头文件
javah -jni HelloWorld
需要注意,需要在java目录下,通过全限定类名的形式生成c代码的头文件
# 生成C/C++头文件
javah -jni com.dolphin.HelloWorld
生成的com_dolphin_HelloWorld.h
头文件应该包含以下内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dolphin_HelloWorld */
#ifndef _Included_com_dolphin_HelloWorld
#define _Included_com_dolphin_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_dolphin_HelloWorld
* Method: printHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_dolphin_HelloWorld_printHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3. 编写C/C++实现
创建一个对应的C/C++实现文件HelloWorld.c
。
#include <jni.h>
#include <stdio.h>
#include "com_dolphin_HelloWorld.h"
// 实现printHelloWorld方法
JNIEXPORT void JNICALL Java_com_dolphin_HelloWorld_printHelloWorld(JNIEnv *env, jobject obj) {
printf("Hello, World from C!");
}
4. 编译C/C++代码
使用gcc
或其他编译器编译C/C++代码,生成动态链接库。
安装gcc 参考我的这篇帖子
https://blog.csdn.net/qq_35977117/article/details/139070603
# 在Windows上生成dll
gcc -shared -o HelloWorld.dll -I"%JAVA_HOME%\\include" -I"%JAVA_HOME%\\include\\win32" HelloWorld.c
# 在Linux上生成so
gcc -shared -o libHelloWorld.so -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" HelloWorld.c
# 在MacOS上生成dylib
gcc -dynamiclib -o libHelloWorld.dylib -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" HelloWorld.c
5. 运行Java程序
确保生成的动态库位于Java的库路径中,然后运行Java程序。
把生成的jdk 放入 jdk 安装目录下的bin目录中,
C:\Program Files\Java\jdk1.8.0_241\bin
或者在path中配置dll lib的文件夹路径,也可以访问到。可以通过打印
System.out.println(System.getProperty("java.library.path"));
输出:
Hello, World from C!