【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪个编程语言更好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值