IntelliJ IDEA平台下JNI编程
- 使用JNI,那就不可避免地需要将C/C++文件编译成dll(windows)或so(Linux)文件
- 在Java代码中需要将调用的C++方法用native修饰。同时在初始化主方法之前需要加载库。(函数System.loadLibrary()是加载dll(windows)或so(Linux)库,只需名称即可,无需加入文件名后缀(.dll或.so)。native关键字将函数sayHello()声明为本地函数,由C/C++实现。具体的实现就在hello.dll(Windows平台)或hello.so(Linux平台)中)
- JNI生成头文件是通过JDK中提供的javah来完成,javah在 {JDKHome}/bin目录中。
- 成的.h头文件 一般如下:
#include <jni.h>
#ifndef _Included_com_zhonghao_java_HelloJNI
#define _Included_com_zhonghao_java_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_com_zhonghao_java_HelloJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 接下来我们只需实现Java_com_zhonghao_java_HelloJNI_sayHello
(JNIEnv *, jobject)即可。仔细观察就会发现这个函数名称是有规律的,即Java_<包><类名><函数名>,JNIEXPORT和JNICALL这两个宏定义暂时不用管。 - 在jni目录中新建HelloJNI.c文件,这里就是需要调用的C方法
#include<jni.h>
#include <stdio.h>
#include "com_zhonghao_java_HelloJNI"
JNIEXPORT void JNICALL Java_com_zhonghao_java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
- 之后就是使用工具将该c编译成dll的动态链接库.方法很多,这里不予详写
- 此时执行java代码,即可以调用到C中的方法。打印出Hello World!
- 项目地址点击这里