我有一个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);