gpt4 book ai didi

java - 从 JNI/NDK 将二维原始数组从 C 返回到 Java

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:02 27 4
gpt4 key购买 nike

我找到了大量关于如何在 JNI 中生成二维基元数组并将其返回给 Java 的文档。但是这些信息无法描述如何在 C 中给定上下文传递一个已经存在的 2D float 组 (float**)。

为了明确描述我的问题,我将添加一些我想要实现的C伪代码:

// Returns a 2D float array from C to Java
jfloatArray ndk_test_getMy2DArray(JNIEnv* env, jobject thiz, jlong context)
{
// Cast my context reference
MyContextRef contextRef = (MyContextRef) context;

// In case we need it below
unsigned int length = MyContextGet1DLength(contextRef);

// Get the 2D Array we want to "Cast"
float** primitive2DArray = MyContextGet2DArray(contextRef);

// Hokus pokus...
// We do something to create the returnable data to Java
//
// Below is the missing piece that would convert the primitive
// 2D array into something that can be returned consumed and consumed
// by Java

jfloatArray myReturnable2DArray

return myReturnable2DArray;
}

我假设这不是直截了当的,因为我还没有找到任何描述这种情况的东西。

感谢您提供任何有用的信息。

最佳答案

感谢 Timo 的帮助和链接。为了后代,我添加了一个完整的代码集,它将经历从现有的 C 2D 原始数组生成 Java 可使用的 2D 原始数组的过程。

// Returns a 2D float array from C to Java
jobjectArray ndk_test_getMy2DArray(JNIEnv* env, jobject thiz, jlong context)
{
// Cast my context reference
MyContextRef contextRef = (MyContextRef) context;

// Get the length for the first and second dimensions
unsigned int length1D = MyContextGet1DLength(contextRef);
unsigned int length2D = MyContextGet2DLength(contextRef);

// Get the 2D float array we want to "Cast"
float** primitive2DArray = MyContextGet2DArray(contextRef);

// Get the float array class
jclass floatArrayClass = (*env)->FindClass(env, "[F");

// Check if we properly got the float array class
if (floatArrayClass == NULL)
{
// Ooops
return NULL;
}

// Create the returnable 2D array
jobjectArray myReturnable2DArray = (*env)->NewObjectArray(env, (jsize) length1D, floatArrayClass, NULL);

// Go through the firs dimension and add the second dimension arrays
for (unsigned int i = 0; i < length1D; i++)
{
jfloatArray floatArray = (*env)->NewFloatArray(env, length2D);
(*env)->SetFloatArrayRegion(env, floatArray, (jsize) 0, (jsize) length2D, (jfloat*) primitive2DArray[i]);
(*env)->SetObjectArrayElement(env, myReturnable2DArray, (jsize) i, floatArray);
(*env)->DeleteLocalRef(env, floatArray);
}

// Return a Java consumable 2D float array
return myReturnable2DArray;
}

关于java - 从 JNI/NDK 将二维原始数组从 C 返回到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com