当前位置: 首页 > 面试题库 >

从JNI / NDK将2D基本数组从C返回到Java

慕承允
2023-03-14
问题内容

我发现了大量有关如何在JNI中生成2D基本数组并将其返回给Java的文档。但是这些信息无法描述如何在 C中* 为上下文传递 已存在的
2D浮点数组(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;
}


 类似资料:
  • 问题内容: 我正在尝试使用android NDK。 有没有办法将在JNI中创建的数组(以我的情况为例)返回给Java?如果是这样,请提供一个可以执行此操作的JNI函数的简单示例。 问题答案: 如果你已经阅读了文档,但仍然有一些问题应作为最初问题的一部分。在这种情况下,示例中的JNI函数将创建多个数组。外部数组由使用JNI函数创建的“对象”数组组成。从JNI的角度来看,这就是一个二维数组,即一个包含

  • C++ 数组 C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并

  • 这已经超出我的想象了,我们开始吧。 我正在用C语言设置一个函数指针,该指针带有一个Java接口对象,看起来像Java端的接口对象: 其中,是只有一种方法的接口: 而指的是Java本机方法,它在C端反映如下: 所有这些都是基于JNI中使用接口实现回调函数编写的 我已经尝试在C端调用Java中定义的方法,它可以工作(就像上面的链接一样),但是现在我正在尝试在C下设置这样的上的值 因此,稍后我想把作为一

  • 我用TestNG创建了一个Selenium框架。在这个@Data提供者中包含一组代码,这些代码从excel中读取数据,并以数组形式将此值返回给@test。 因为登录测试用例有两个输入,所以方法login有两个属性。同样,若寄存器测试用例有5个输入,那个么寄存器方法将有5个属性。但我想以某种方式创建一个标准方法,这样当我从@dataprovider返回数组时。然后@test方法应该动态读取值,而不是

  • 问题内容: 我有一个字符串数组一样,我想这个数组发送到 ç 使用 JNI 。我找不到任何明确的解决方案。我试图将此字符串视为成功,但没有成功。 有没有办法做到这一点? 问题答案: 您可以编写一个简单的函数,该函数接受一个对象,将每个对象强制转换为jstring,然后对其进行调用。 像这样:

  • 问题内容: 我正在使用ctypes在Python中实现C 函数。C 函数应返回一个指向数组的指针。不幸的是,我还没有弄清楚如何在Python中访问数组。我尝试了numpy.frombuffer,但是没有成功。它只是返回一个任意数字的数组。显然我没有正确使用它。这是一个简单的示例,数组大小为10: function.cpp的内容: wrapper.py的内容: 要编译我正在使用的C ++文件: 您对