【问题标题】:Copying C Array into Java Array Using JNI使用 JNI 将 C 数组复制到 Java 数组
【发布时间】:2010-03-01 05:30:08
【问题描述】:

我有一个 C 语言中的无符号整数数组和一个长整数 java 数组。我想将无符号整数的内容复制到 java 数组。到目前为止,我发现的唯一函数是 SetLongArrayRegion(),但这需要整个缓冲区数组。有没有只设置java数组的单个元素的函数?

【问题讨论】:

    标签: c arrays java-native-interface set


    【解决方案1】:

    还有一个用于原始“long”类型的函数来设置 JNI 中的单个元素。所以我相信你想要的就是这样的

    unsigned int* cIntegers = getFromSomewhere();
    int elements = sizeof(cIntegers) / sizeof(int);
    
    jfieldID jLongArrayId = env->GetFieldID(javaClass, "longArray", "[J");
    jlongArray jLongArray = (jlongArray) env->GetObjectField(javaObject, jLongArrayId);
    for (unsigned int i = 0; i < elements; ++i) {
       unsigned int cInteger = cIntegers[i];
       long cLong = doSomehowConvert(cInteger);
       env->SetLongArrayElement(jLongArray, i, (jlong) cLong);
    }
    

    如果java中的长数组被称为longArray,并且java类被保存在一个JNI jclass变量javaClass中。

    【讨论】:

    • 很抱歉这么久才回答这个问题。我没有意识到我没有点击复选框。感谢您的帮助。
    【解决方案2】:

    有一个 SetObjectArrayElement() 函数,适用于非本地类型。如果您真的非常想使用这种方法,我认为您可以创建一个 Long 数组。不过,您可能仍然会遇到类型转换的问题。

    我认为你的大问题是你试图将无符号整数转换为 Java 长整数。 Java long 是 有符号 64 位数字。正确转换后,您可以在 c 中创建一个 jlong​​ 类型的数组,然后使用 SetLongArrayRegion() 方法将数字返回给 java。

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 2018-01-19
      • 1970-01-01
      • 2017-08-30
      • 2014-09-07
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多