java - 从普通 c int[] 组成 jintArray 的 JNI 函数

标签 java interface java-native-interface native

我现在一直在寻找一些方法来解决这个问题,但我发现没有任何东西可以正确回答这个问题。我想我已经很接近了;我需要一个 jint* 和一个 int*,以及使用 (*env)->SetIntArrayRegion(...) 函数,

//  This function will take an array of global integers that already exist in the
//  c-side of the program, we'll call them 'data_ints[91]' (there are 91 just to clarify.)
/*...*/
int data_ints[] = {1,2,3,4,/*...*/90,91};

JNIEXPORT jintArray JNICALL Java_MarsRoverGUI_getData
(JNIEnv *, jobject, jint)
{
    jintArray out_ints;
    jint *outElements;
    int i;

    out_ints = (*env)->NewIntArray(env, 91);
    outElements = (*env)->GetIntArrayElements(env,out_ints,0);
    for (i = 0; i < 91; i++)
    {
        outElements[i] = data_ints[i];
    }
    (*env)->ReleaseIntArrayElements(env,out_ints,outElements,0);

    // returns data_ints as a jintArray
    return out_ints;
}

我到底有多接近?我没有有效的方法来测试 JNI/:请随意提出方法!

谢谢大家

最佳答案

如果我很好地理解您的问题,这应该对您有用。您似乎对 int/jint 转换感到不安,但您不必这样做,因为 jint 只是 int< 的 typedef/.

JNIEXPORT jintArray JNICALL Java_MarsRoverGUI_getData
(JNIEnv *, jobject, jint)
{
    jintArray out_ints;

    out_ints = (*env)->NewIntArray(env, 91);
    (*env)->SetIntArrayRegion(env, out_ints, 0, 91, data_ints);

    // returns data_ints as a jintArray
    return out_ints;
}

如果有任何不清楚的地方,或者我是否误解了您的问题,请告诉我!

关于java - 从普通 c int[] 组成 jintArray 的 JNI 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13637525/

相关文章:

user-interface - 用于批处理文件的 GUI?

java - Swig:将 Java 中的字节数组传递给 C

java - native Thread 类函数的 JNI 流程是什么?

java - GridLayout 在后台运行良好,但在真实设备上不显示

java - 这个程序什么时候调用paint?另外,为什么它扩展 Canvas ?

javascript - AngularJS $资源参数名称

java - 如何通过 JNI 将 List + Hashmap 获取到 C++ 代码

java - Eclipse 插件项目中的库

java - 将 wicket 页面的内容包含到 wicket 面板中

c#接口(interface)实现错误