JNI的使用
JNI 定义与作用
JNI(Java Native Interface) 是 Java 平台的一部分,定义了一套编程框架,允许运行在 JVM 中的 Java 代码与其他语言(如 C、C++、汇编)编写的本地代码交互。其核心作用包括:
- 复用现有代码:直接调用 C/C++ 高性能库(如数学计算、图像处理)。
- 访问系统特性:操作硬件驱动或操作系统级 API。
- 性能优化:对计算密集型任务使用本地代码加速。
java代码调用c代码
1.首先安装java和c环境,本人实在windows调试。
2.编写java类JniDemo.java,包含两个native方法get、set,和程序入口main
public class JniDemo {public native int get();public native void set(int value);public void callback(int state) {System.out.println("JniDemo callback: " + state);}public static void main(String[] args) {System.loadLibrary("jni_lib");JniDemo demo = new JniDemo();System.out.println("JniDemo get: " + demo.get());System.out.println("JniDemo set: ");demo.set(1);}
}
3.编译Java类文件,命令javac JniDemo.java
4.生成c头文件,命令javah JniDemo,头文件如下
编辑器可打开,里面有用c声明的接口函数
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniDemo */#ifndef _Included_JniDemo
#define _Included_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/** Class: JniDemo* Method: get* Signature: ()I*/
JNIEXPORT jint JNICALL Java_JniDemo_get(JNIEnv *, jobject);/** Class: JniDemo* Method: set* Signature: (I)V*/
JNIEXPORT void JNICALL Java_JniDemo_set(JNIEnv *, jobject, jint);#ifdef __cplusplus
}
#endif
#endif
5.用c实现头文件中的native接口,impl.c
#include <jni.h>
#include <stdio.h>
#include "JniDemo.h"JNIEXPORT jint JNICALL Java_JniDemo_get(JNIEnv *env, jobject obj) {printf("c-get\n");return 1;
}JNIEXPORT void JNICALL Java_JniDemo_set(JNIEnv *env, jobject obj, jint value) {printf("c-set %d\n", value);
}
6.(windows)将c文件编译为动态库,命名jni_lib.dll,命令如下
gcc -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o jni_lib.dll impl.c
7.执行java字节码,命令java JniDemo,如下可见java和c的日志都打印出来,java调用c成功
c代码调用java代码
基于java反射机制
如何在C和Java之间实现互相调用? - 树叶云
JNI开发基础篇:C语言调用Java中的方法_jni c调用java方法-CSDN博客