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

【JNI】数组的基本使用

在上一期讲了基本类型的基本使用,这期来说一说数组的基本使用

HelloJNI.java:实现myArray函数,把一个整型数组转换为双精度型数组

public class HelloJNI { static {System.loadLibrary("hello"); }private native String HelloWorld();private native double avg(int n1, int n2);private static native double[] myArray(int[] arr);public static void main(String[] args) {System.out.println(new HelloJNI().HelloWorld());System.out.println(new HelloJNI().avg(8,3));int[] arr={6,4,3,2,11};double[] ans=myArray(arr);for (double i : ans) {System.out.println(i*2);}}}

生成HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     HelloJNI* Method:    HelloWorld* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_HelloJNI_HelloWorld(JNIEnv *, jobject);/** Class:     HelloJNI* Method:    avg* Signature: (II)D*/
JNIEXPORT jdouble JNICALL Java_HelloJNI_avg(JNIEnv *, jobject, jint, jint);/** Class:     HelloJNI* Method:    myArray* Signature: ([I)[D*/
JNIEXPORT jdoubleArray JNICALL Java_HelloJNI_myArray(JNIEnv *, jclass, jintArray);#ifdef __cplusplus
}
#endif
#endif

然后在HelloJNI.cpp中实现相应函数:

#include "HelloJNI.h"
#include <iostream>
#include <jni.h>
using namespace std;JNIEXPORT jstring JNICALL Java_HelloJNI_HelloWorld(JNIEnv *env, jobject obj){return env->NewStringUTF("JNI, hello world!");
} JNIEXPORT jdouble JNICALL Java_HelloJNI_avg(JNIEnv *env, jobject obj, jint a, jint b){return ((jdouble)a+b)/2;
}JNIEXPORT jdoubleArray JNICALL Java_HelloJNI_myArray(JNIEnv *env, jclass obj, jintArray arr){// 获取Java整数数组的长度  jsize len = env->GetArrayLength(arr);  // 创建一个新的Java双精度浮点数数组  jdoubleArray result = env->NewDoubleArray(len);  if (result == nullptr) {  return nullptr; // 内存分配失败,返回null  }  // 获取Java整数数组的元素  jint *intElements = env->GetIntArrayElements(arr, nullptr);  if (intElements == nullptr) {  return nullptr; // 内存分配失败,返回null }  // 设置Java双精度浮点数数组的元素  jdouble *doubleElements = env->GetDoubleArrayElements(result, nullptr);  if (doubleElements == nullptr) {  env->ReleaseIntArrayElements(arr, intElements, 0); // 释放整数数组元素  return nullptr; // 内存分配失败,返回null(应该处理异常,但这里简化了)  }  // 执行转换  for (jsize i = 0; i < len; i++) {  doubleElements[i] = intElements[i]; }  // 释放数组元素 env->ReleaseDoubleArrayElements(result, doubleElements, 0);  env->ReleaseIntArrayElements(arr, intElements, 0);  // 返回转换后的数组  return result;  
}

编译链接运行:

g++ -fpic -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.cpp
java -Djava.library.path=. HelloJNI

结果:

image-20241005194123206


http://www.mrgr.cn/news/43508.html

相关文章:

  • JDBC编程
  • CE-MD机械指令办理项目及要求
  • GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】
  • Linux驱动开发(速记版)--printctl子系统
  • 算法修炼之路之滑动窗口
  • ​一篇关于密码学的概念性文章
  • 前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
  • (杨辉三角) 攻防世界--->notsequence
  • leetcode面试题17.04:消失的数字(C语言版)
  • Gitlab flow工作流
  • linux—进程控制
  • 【信息系统项目管理师 考题预测】采购管理
  • Linux多线程
  • 【在Linux世界中追寻伟大的One Piece】进程信号
  • 【微服务】服务注册与发现、分布式配置管理 - Nacos
  • 智谱AI开源CogView3及升级版,文生图技术新突破!
  • java 数据存储方式
  • 有关自连接表的统一封装
  • Ray_Tracing_The_Next_Week下
  • 基于Pcap4j收发自定义协议报文(注意事项/踩坑总结)