Java JNI本地方法调用
实现步骤
- 编写带有native关键字声明的java方法
- 使用javac编译写好的java类
- 使用javah -jni className来生成后缀名为 .h 的头文件
- 使用C或C++实现本地方法
- 将本地方法编写的文件生成动态链接库
编写Java类 HelloWorld.java
public class HelloWorld {
public native void hello();
static {
//设置查找路径为当前项目路径
System.setProperty("java.library.path", ".");
//加载动态库的名称
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().hello();
}
}
编译Java类 HelloWorld.class
javac HelloWorld.java
生成头文件 HelloWorld.h
javah -jni HelloWorld
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
C语言实现本地方法 HelloWorldImpl.c
#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
printf("Hello World Zhangsan!\n");
return;
}
编译为动态链接库
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib
运行
java HelloWorld
结果
Hello World Zhangsan!