当前位置: 首页 > news >正文

JNI的使用

JNI 定义与作用

JNI(Java Native Interface)‌ 是 Java 平台的一部分,定义了一套编程框架,允许运行在 JVM 中的 Java 代码与其他语言(如 C、C++、汇编)编写的本地代码交互‌。其核心作用包括:

  1. 复用现有代码‌:直接调用 C/C++ 高性能库(如数学计算、图像处理)。
  2. 访问系统特性‌:操作硬件驱动或操作系统级 API‌。
  3. 性能优化‌:对计算密集型任务使用本地代码加速‌。

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博客

相关文章:

  • 华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 设计模式(责任链模式)
  • SyntaxError: Unexpected end of JSON input 内容被截断报错
  • ios接入穿山甲【Swift】
  • 自动驾驶创建场景(just soso)
  • 用 Iris数据做决策树分析
  • 充电宝项目:规则引擎Drools学习
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——EEPROM、SPI FLASH测试 #AT24C64 #W25Q128
  • 黑马商城项目(二) Docker
  • Docker 中多个容器之间的通信
  • (Linux操作系统)自定义shell的实现
  • react使用createFromIconfontCN,自定义iconfont 图标
  • 艺术字体AI生成阿里云WordArt锦书、通义万相、SiliconFlow、Pillow+OpenCV本地生成艺术字体
  • web前端开发:CSS的常用选择器
  • 第七节:React HooksReact 18+新特性-并发模式(Concurrent Mode)解决了什么问题?
  • C++ IO流
  • CANoe自动化测试用例log保存(专栏:车载网络诊断测试攻略从零开始搭建一个UDS诊断自动化测试CANoe工程)
  • 58.最后一个单词的长度
  • 使用excel 制作数据库的数据浏览器
  • 使用cursor进行原型图设计
  • 脑白金广告/网络营销seo优化
  • dw网站log怎么做/拉新推广怎么做代理
  • 学校网站建设营运预算/珠海百度seo
  • 手机网站软件/廊坊网站seo
  • 做电影网站用什么软件叫什么/seo博客推广
  • 建设高端网站的公司/什么叫关键词