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

3

我希望使用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]

我的最终目标是这个
我相信从JNI到Java传递数组时出现了问题。

这样打印数组元素是否正确?
我是JNI的新手,需要一些帮助。

1个回答

0

你的JNI没问题,只是你访问数组的方式有误。不能假设jint只占1个字节,实际上它可能是4个字节的长整型...使用sizeof运算符让编译器根据你所针对的系统来决定它应该是多少字节;)

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接