目录
前言
1、创建 java native 方法
2、创建洞态链接库项目
3、加载 dll 文件
前言
Java 提供了调用 C 或 C++ 函数的方法,这种方法就是 native 方法,全称 Java Native Interface (JNI)
1、创建 java native 方法
1)新建 java 类文件
创建一个 java 类文件,编写 native 方法
package demo;
public class Test {
public native static void Hello(String cmd);
}
2)编译 java 类文件
将这个 Test.java 编译成 c/c++ 的头文件
jdk 9 以下版本:
javac Test.java
javah -jni Test
jdk 9 以上版本,"." 表示在当前目录下生成头文件:
javac -h . Test.java
执行完成后在当前目录下就会生成一个 demo_Test.h 的头文件,头文件的命名规则是:java 的包名连接上 java 类名,就是 packageName_className.h
2、创建洞态链接库项目
1)clion 新建 library 项目
clion 新建一个 library 项目,library 的类型选择 shared,就会在项目构建成功后生成 dll 文件
2)添加依赖的头文件
将上面生成的 demo_Test.h 移到这个 c/c++ 项目中,将 jdk\include\jni.h 文件复制到这个项目zhong,jdk\include\win32\jni_md.h 也复制到这个项目中
将 demo_Test.h 中引入的 <jni.h> 改成 "jni.h"
创建一个 cpp 文件,引入 demo_Test.h 头文件
3)补充方法体
在这个 cpp 文件中编写 java native 方法的方法体
#include "demo_Test.h"
#include <iostream>
#include <stdlib.h>
#include <process.h>
using namespace std;
JNIEXPORT void JNICALL Java_demo_Test_Hello
(JNIEnv *env, jclass cls, jstring jstr){
const char *cstr = (*env).GetStringUTFChars(jstr, NULL);
if (cstr == NULL) {
cout<<"Type conversion failed"<<endl;
} else{
system(cstr);
}
(*env).ReleaseStringUTFChars(jstr, cstr);
}
这里的功能是让它执行一个系统命令,要使用 native 方法传递过来的字符串,需要使用 jni.h 里面提供的方法进行类型转换,将 jstring 转换为 c 里面的 char*
4)构建这个 library 项目
生成了一个 dll 文件
3、加载 dll 文件
将上面生成的 dll 文件复制到最开始创建的 java 项目中,使用 System.load 加载刚才生成的 dll,注意这里使用的是 dll 的绝对路径
System.load("D:\\Projects\\Java\\untitled\\src\\main\\java\\demo\\libJavaNativeForC.dll");
给它传入一个参数,让它打开计算器
public static void main(String[] args){
System.load("D:\\Projects\\Java\\untitled\\src\\main\\java\\demo\\libJavaNativeForC.dll");
Hello("calc");
}