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.dll
System.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);
}
}