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

Jni常用的代码

Jni

JNI(Java Native Interface,Java 本地接口) 是 Java 平台提供的一种编程框架,它允许 Java 代码与用其他语言(主要是 C/C++)编写的本地代码进行交互。简单说,JNI 是 Java 调用本地代码的桥梁。

Jni 需要用到一些 C语言的代码。

C语言结构体

C语言结构体类似java的类,只是没有方法(函数)。

数组初始化:

  • 定义好数组长度后,就可以用:{0} 将所有元素初始化:
// 所有元素初始化为0 jint localArray[10] = {0};

字节数组 jbyteArray 转换为结构体:

JNIEXPORT jbyteArray JNICALL Java_com_cf_lib_w4_W4Parser_calcResult( JNIEnv *env, jclass type, jbyteArray byteArrayParam_){ if ((*env)->IsSameObject(env, byteArrayParam_, NULL)) { cy_log("input parameter byteArrayParam_ error\r\n"); return NULL; } int32_t len = (*env)->GetArrayLength(env, byteArrayParam_); int32_t sLen = sizeof(param_t); if (len != sLen) { cy_log("input parameter param_ length error\r\n"); return NULL; } param_t param = {0}; (*env)->GetByteArrayRegion(env, byteArrayParam_, 0, len, (jbyte *)&param);

结构体转化为 字节数组 jbyteArray :

int32_t resultLen = sizeof(struct_data_t); jbyteArray array = (*env)->NewByteArray(env, resultLen); (*env)->SetByteArrayRegion(env, array, 0, resultLen, (const jbyte *)&structData);

数组转换为 jbyteArray:

JNIEXPORT jbyteArray JNICALL Java_com_cf_lib_w4_abc_W4Parser_calc ( JNIEnv *env, jclass type, jbyteArray param_ ) { // 只计算 param_array 数组部分的大小 int32_t array_size = sizeof(param_array); // 创建字节数组(仅包含 param_array 数据) jbyteArray result = (*env)->NewByteArray(env, array_size); if (result == NULL) { cy_log("Failed to create byte array\r\n"); return NULL; } // 将 param_array 数组数据复制到字节数组 (*env)->SetByteArrayRegion(env, result, 0, array_size, (jbyte *)param_array);

jbyteArray 转化为结构体数组:

JNIEXPORT jbyteArray JNICALL Java_com_cf_lib_w4_abc_W4Parser_calc ( JNIEnv *env, jclass type, jbyteArray param_ ) { if ((*env)->IsSameObject(env, param_, NULL)) { cy_log("input parameter [param_] error\r\n"); return NULL; } int32_t total_len = (*env)->GetArrayLength(env, param_); // 结构体大小 int32_t element_size = sizeof(struct_data_t); // 分配内存存储结构体数组,注意:使用过 malloc 分配内存,最后记得用 free释放。 struct_data_t *param_array = (struct_data_t*)malloc(total_len); if (param_array == NULL) { cy_log("memory allocation failed.\r\n"); return NULL; } // 将Java字节数组转换为结构体数组 (*env)->GetByteArrayRegion(env, param_, 0, total_len, (jbyte *)param_array); // 释放内存 free(param_array); }

free 释放内存:

使用过 malloc 分配内存,最后记得用 free释放。

// 释放内存 free(param_array);
http://www.cnnetsun.cn/news/73509.html

相关文章:

  • 终极轨道计算指南:3个实战技巧解析
  • 时区相关的问题,开发如何自测?
  • 城通网盘直链解析神器:三步解锁高速下载新体验
  • 21届智能车赛外延创意:用车载语音指令触发ACE-Step音乐生成
  • 2025年8款AI论文生成器大揭秘,一键极速写超长篇论文,效率提升300%!
  • 还在用留AIGC痕迹的AI写论文?7款免费工具知网维普查重过
  • Wan2.2-T2V-5B模型部署指南:快速搭建你的实时视频生成服务
  • HunyuanVideo-Foley实战教程:使用Git下载并运行视频音效AI
  • 开源不等于免费:ACE-Step商业化路径中GPU算力与Token的定价策略
  • 【直接抄作业】漏洞挖掘典型场景 + 思路(超详细),零基础入门到精通,一篇搞定
  • EasyAdmin8:企业级后台管理系统的完整解决方案
  • VSCode插件助力SD3.5开发:高效调试FP8模型的实用技巧
  • 终极指南:5分钟掌握移动端选择器开发的完整方案
  • Nginx反向代理配置ACE-Step后端服务:保障高并发下的稳定输出
  • 使用MySQL创建数据库数据表等的完整过程
  • FLUX.1-dev模型本地部署教程:从Git Clone到PyTorch安装全流程
  • 从文本到旋律:ACE-Step如何用自然语言生成完整音乐作品
  • 使用HuggingFace镜像网站加速Qwen3-VL-8B模型拉取
  • ComfyUI节点扩展:将Qwen-Image-Edit-2509嵌入图形化界面
  • 城通网盘直链解析:3步实现高速下载的实用指南
  • Qwen3-14B在金融报告自动生成场景的应用实例
  • 实测对比:LLama-Factory与其他微调框架在GPU利用率上的表现差异
  • Editly终极指南:零基础掌握声明式视频编辑
  • Editly容器化部署:告别环境配置困扰的智能视频编辑方案
  • 【动力学】飞机起落架的机械动力学与分析与仿真【含Matlab源码 14708期】
  • 【运动学】模拟具有不同詹森效应和摩擦效应及干扰现象的离散宏观粒子【含Matlab源码 14710期】
  • 仅需一行命令,几秒内搞定网站部署!
  • RAG还是Fine-tuning?大模型应用的“生死抉择”,选错路,白干一年
  • 如何在本地部署HunyuanVideo-Foley镜像?超详细git clone教程分享
  • 56、高级安全特性:保障系统安全的综合指南