在jni中int*到JintArray的值错误



我有一个c函数int* GenerateIntArray()

将生成一个int数组,如[0,8,28,108,0,3]并返回int *

int* GenerateIntArray(){ 
int rtn[6]={0,8,28,108,0,3};
return rtn;
}

在我的jni层:fun gettintarrayfromjni:JIntArray

我这样做是为了从C库

获取Int*
jintArray rtn = env->NewIntArray(6);
int *temp = C_GetINTArrayData();
env->SetIntArrayRegion(rtn, 0, 6, temp);
return rtn; 
并将其转换为IntArray

但在Android层:fun gettintarrinandroid ():IntArray

var result=getIntArrayFromJNI()

我检查数据列表它显示[-214587424,119,0,0,205189680,-1275068295]

转换Int数组是错误的?

当你想这样做的时候,你可以改变你的void GenerateIntArray()代码:

int* GenerateIntArray()
{ 
static int rtn[6]={0,8,28,108,0,3};
return rtn;
}

因为,int数组是在堆栈上分配的,当函数返回时它将消失。

由于您的问题似乎来自您的GenerateIntArray函数,返回指向局部变量的指针(这根本不是一个好主意),我建议您以更合适的方式重写函数:

void GenerateIntArray(int *buffer, size_t size) 
{
for(size_t i = 0; i < size; ++i) 
// do something with your buffer...
}

你应该用一个有效的指针来调用GenerateIntArray,像这样:

int array[256];
GenerateIntArray(array, 256);

或使用动态分配的缓冲区,如:

int* buffer = (int*)malloc(256 * sizeof(int));
GenerateIntArray(buffer, 256);

或者,在c++中使用vector标准容器,如@Michael在注释中建议的:

void GenerateIntArray(std::vector<int>& array) 
{
// do something with your array...
}

的用法如下:

std::vector<int> my_array;
GenerateIntArray(my_array);

最新更新