一、编写java代码
public class NativeCaller {
// 声明native方法,注意这里只有方法声明,没有方法体
public native int add(int a, int b);
// 加载动态链接库,库名需与后续生成的动态链接库名一致
static {
System.loadLibrary("NativeCaller");
}
}
二、根据Java代码生成头文件
javah -classpath D:\myProject\TestNativeMethod\src -jni NativeCaller
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeCaller */
#ifndef _Included_NativeCaller
#define _Included_NativeCaller
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativeCaller * Method: add * Signature: (II)I */JNIEXPORT jint JNICALL Java_NativeCaller_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
三、编写头文件实现
在这个 C++ 代码中,Java_NativeCaller_add函数是对 Java 中NativeCaller类的add方法的实现。JNIEnv指针提供了 JNI 的各种函数调用接口,jobject表示调用该方法的 Java 对象,jint是 JNI 中对应 Java int类型的数据类型。
#include <jni.h>
#include "NativeCaller.h"
#include <iostream>
// 实现Java中声明的add方法
JNIEXPORT jint JNICALL Java_NativeCaller_add
(JNIEnv *env, jobject obj, jint a, jint b) {
return a + b;
}
四、打dll链接库
-shared生成共享库,-o指定输出文件名,-I指定jni.h及其相关头文件所在目录,路径需根据实际安装的 JDK 路径调整。生成的动态链接库文件名需遵循 Linux 下共享库命名规范,以lib开头。
win
g++ -shared -o NativeCaller.dll NativeCaller.cpp -I "D:\jdk-21.0.2\include" -I "D:\jdk-21.0.2\include\win32"
linux
g++ -shared -o [libNativeCaller.so](http://libNativeCaller.so) NativeCaller.cpp -I /usr/lib/jvm/java-11-openjdk-amd64/include -I /usr/lib/jvm/java-11-openjdk-amd64/include/linux
五、拷贝dll文件到bin目录
D:\jdk-21.0.2\bin