1. 测试环境
- 操作系统:win10
- JDK版本:JDK11 安装教程
- gcc版本:8.1.0
2. 声明native方法
// HelloJNI.java
public class HelloJNI {// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native static int add(int a, int b);}
3. 生成头文件
javac -h ./ HelloJNI.java
注1:jdk10开始,javah被融合到javac中,使用javac -h替代javah
注2:"./"与"HelloJNI.java"之间需要用空格分开
注3:如果java文件中存在中文注释,可添加编码规则 javac -encoding utf-8 -h ./ HelloJNI.java
// 生成的HelloJNI.h文件
/* 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 *, jclass);/** Class: HelloJNI* Method: add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_HelloJNI_add(JNIEnv *, jclass, jint, jint);#ifdef __cplusplus
}
#endif
#endif
4. 创建C++文件
// HelloJNI.cpp
#include "HelloJNI.h"
#include <iostream>JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jclass) {std::cout << "Hello from cpp." << std::endl;
}JNIEXPORT jint JNICALL Java_HelloJNI_add(JNIEnv *, jclass, jint a, jint b) {return a + b;
}
5. 生成动态链接库ddl
g++ -o hello.dll -fPIC -shared -I"D:\java\jdk11\include\win32" -I"D:\java\jdk11\include" HelloJNI.cpp
注:两个-I参数的路径需要修改成对应的jdk安装路径
6. 调用C++函数
// HelloJNI.java
public class HelloJNI {static {// 加载C++文件生成的动态链接库// hello为生成的动态链接库名称hello.dllSystem.loadLibrary("hello");}// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native static int add(int a, int b);public static void main(String[] args) {// 调用hell函数HelloJNI.sayHello();// 调用add函数int res = HelloJNI.add(1, 2);System.out.println("res = " + res);}
}