在 jni 中从 int* 到 JintArray 获取错误值

Get wrong value from int* to JintArray in jni

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

它将生成一个int数组,如[0,8,28,108,0,3]和return by Int*

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

在我的 jni 层中:有趣 getIntArrayFromJNI:JIntArray

我这样做是为了从 C Lib 中获取 Int*

jintArray rtn = env->NewIntArray(6);
int *temp = C_GetINTArrayData();
env->SetIntArrayRegion(rtn, 0, 6, temp);
return rtn; 

并将其转换为 IntArray

但在 Android 层:fun getIntArrInAndroid():IntArray

var result=getIntArrayFromJNI()

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

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

或者,按照@Michael 在评论中的建议,以 C++ 方式使用向量标准容器:

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

具有以下用法:

std::vector<int> my_array;

GenerateIntArray(my_array);

当您想以这种方式执行此操作时,您可以将 void GenerateIntArray() 代码更改为:

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

因为int数组是分配在栈上的,当函数运行时会消失returns。