在 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。
我有一个 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。