> 文章列表 > java native 方法编写

java native 方法编写

java native 方法编写

目录

前言 

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");}