使用JNI中的GetIntArrayElements打印数组元素

时间:2014-07-30 05:34:31

标签: java android c java-native-interface

我想使用GetIntArrayElements打印jint数组的内容 我的代码如下。

JNI代码(C):

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "JNI", __VA_ARGS__)

int size = 5;
jint test_arr[size] = {1, 2, 3, 4, 5};      /* Array to be printed */

jintArray result_arr = (*env)->NewIntArray(env, size);
(*env)->SetIntArrayRegion(env, result_arr, 0, size, test_arr);

/* Print the Value of the Array */
jint *ptr = (*env)->GetIntArrayElements(env, result_arr, NULL);

for (i = 0; i < size; i++)
    LOGI("[%d]", *(ptr + i));

(*env)->ReleaseIntArrayElements(env, result_arr, ptr, NULL);

输出:

I/[JNI] ( 1835): [0]
I/[JNI] ( 1835): [1092010456]
I/[JNI] ( 1835): [1092201680]
I/[JNI] ( 1835): [1526497088]
I/[JNI] ( 1835): [0]

预期输出:

I/[JNI] ( 1835): [1]
I/[JNI] ( 1835): [2]
I/[JNI] ( 1835): [3]
I/[JNI] ( 1835): [4]
I/[JNI] ( 1835): [5]

我的最终目标是this 我相信Array没有从JNI正确传递给Java。

这是打印数组元素的正确方法吗?
我是JNI的新手。需要一些帮助。

1 个答案:

答案 0 :(得分:0)

您的JNI很好,您只是搞砸了如何访问阵列。你不能假设jint是1个字节,实际上它可能是4个字节的长整数...使用sizeof运算符让编译器根据你所针对的系统决定它应该是什么;)< / p>

更改LOGI("[%d]", *(ptr + i));LOGI("[%ld]", *(ptr + (sizeof(jint) * i)));

更新:之前我没有抓住这个但看起来你在(*env)->SetIntArrayRegion(env, result_arr, 0, size, test_arr);中反转了result_arr和test_arr你想从test_arr中读取并写入result_arr (*env)->SetIntArrayRegion(env, test_arr, 0, size, result_arr);