c++android ndk与array配合使用

c++ android ndk work with array

本文关键字:array ndk c++android      更新时间:2023-10-16

我有一个大问题,我不使用c++。我通过jni将一个数组从java传递给c++,我想在c++内部创建一个相同长度的新数组。这是以下代码:

#include <string.h>
#include <jni.h>

extern "C"
{
JNIEXPORT void JNICALL Java_com_profesionphotostudio_pps_Imageprocessing_process(JNIEnv* env, jobject thiz, jintArray pixelArray, jintArray ddimensions, jint function)
{
    int *pixels = env->GetIntArrayElements( pixelArray, 0);
    jsize length = env->GetArrayLength(pixelArray);
    int *d= env->GetIntArrayElements(ddimensions, 0);

    int i, j, pixel, red, green, blue, h,w;
    w=d[0]; h =d[1];

    int *temppixel= new int[length];
    for(i=0; i<=w*h; i++)
    {
        temppixel[i]=-1;
    }
    delete [] temppixel;
    env->ReleaseIntArrayElements( pixelArray, pixels, 0);
    env->ReleaseIntArrayElements(ddimensions, d, 0);
 }

但我收到这个错误:

    Fatal signal 11 (SIGSEGV) at 0x00097756 (code=1), thread 9082 (photostudio.pps)

当我手动设置时

 length = 100000; 

我的代码运行得很好。我也试着设置

length = w*h; 

但我收到了相同的致命信号错误

在ddidimensions数组中,我保留位图的高度和宽度,pixelArray包含该位图的int值

更换

for(i=0; i<=w*h; i++)

通过

for(i=0; i<w*h; i++)

或者,您将访问超出其边界的数组(数组索引从0n-1)。

无论wh的值是多少(至少是正数),代码都有效:

int h = 10;
int w = 15;
int *temppixel = new int[w*h];
for(i=0; i<w*h; i++)
{
    temppixel[i] = -1;
}
delete [] temppixel;

这在C++中是绝对有效的。如果它仍然崩溃,那么问题一定来自其他地方(那么你需要隔离问题)。

因为函数中没有正确计算数组的长度,所以应该是这样的:

jsize length=env->GetArrayLength(env,pixelArray);