首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么需要创建一个临时数组来将数组从jni返回到java

为什么需要创建一个临时数组来将数组从jni返回到java
EN

Stack Overflow用户
提问于 2013-04-02 21:42:22
回答 1查看 2.7K关注 0票数 3

对于下面从jni为java创建整数数组的代码,为什么我们需要创建一个temp[]数组,为什么我们不能只填充result[]数组并将其返回给java。是不是因为java和jni应该使用不同的内存空间,从而使用两个不同的指针?如果是这样,那是什么目的呢?谢谢

代码语言:javascript
运行
复制
JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size)
{
 jintArray result;
 result = (*env)->NewIntArray(env, size);
 if (result == NULL) {
     return NULL; /* out of memory error thrown */
 }
 int i;
 // fill a temp structure to use to populate the java int array
 jint temp[256];
 for (i = 0; i < size; i++) {
     temp[i] = 0; // put whatever logic you want to populate the values here.
 }
 // move from the temp structure to the java structure
 (*env)->SetIntArrayRegion(env, result, 0, size, temp);
 return result;
}
EN

回答 1

Stack Overflow用户

发布于 2013-04-02 22:09:38

原因是,你不能直接从jinitArray修改对象,因为它们是Java对象而不是C对象。

在您的示例中,您将创建一个C数组,并将其移动到Java structure中。在更改数组内容时,必须遵循相同的方法。你需要一个访问器来提供C的数组。

如何使用JNI修改数组的示例。

代码语言:javascript
运行
复制
JNIEXPORT jintArray JNICALL Java_SendArray_loadFile(JNIEnv *env, jobject obj, jintArray input) {

    // Convert incoming JNI jinitarray to C's native jint[]
    jint *inputArray = env->GetIntArrayElements(env, input, NULL); // if last param JNI_TRUE, then a copy is returned.

    if(NULL == inputArray) {
       return NULL ;
    }

    const jsize length = env->GetArrayLength(input);

    for (int i = 0; i < length; i++) {
        inputArray[n] = 0; //We can operate on native jinit[] elements.
    }

    // Convert the C's native jinit[] int JNI jinitarray
    env->ReleaseIntArrayElements(env, input, inputArray, 0); // 0 - copy back the content and free the `input` buffer

    return inputArray;
}

这是因为Java数组中的引用类型类似于class。这就是为什么您需要在JNI数组和本机数组之间进行转换。

注意:给出的例子请参考int类型。JNI定义了九种类型的数组,八种用于基本类型(boolean、short、char、byte、int、long、float、double),另一种用于Object。

参考资料:

Get< PrimitiveType>ArrayElements Routines

Java Programming Tutorial Java Native Interface

Accessing Java Arrays

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15765709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档