Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C NDK-阵列分配/解除分配_C_Arrays_Memory Management_Android Ndk_Native - Fatal编程技术网

C NDK-阵列分配/解除分配

C NDK-阵列分配/解除分配,c,arrays,memory-management,android-ndk,native,C,Arrays,Memory Management,Android Ndk,Native,我想将位图像素复制到一个3D数组中,并从这个3D数组中为特定的图像处理算法分配新的数组。我的代码将涉及使用MD数组最多。我想要一种高效的方法,快速且无内存开销/泄漏 以下是我当前的Cpp代码: #include <jni.h> #include <android/log.h> #include <android/bitmap.h> #include "com_example_ndk_MainActivity.h" #include <stdio.h>

我想将位图像素复制到一个3D数组中,并从这个3D数组中为特定的图像处理算法分配新的数组。我的代码将涉及使用MD数组最多。我想要一种高效的方法,快速且无内存开销/泄漏

以下是我当前的Cpp代码:

#include <jni.h>
#include <android/log.h>
#include <android/bitmap.h>
#include "com_example_ndk_MainActivity.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct {

    uint8_t red;
    uint8_t green;
    uint8_t blue;
    uint8_t alpha;
} argb;



JNIEXPORT void JNICALL Java_com_example_ndk_MainActivity_invert(JNIEnv *env, jobject obj, jobject bitmapcolor,jobject bitmapgray)
{
    AndroidBitmapInfo infocolor;
    void* pixelscolor;
    AndroidBitmapInfo infogray;
    void* pixelsgray;
    int ret;
    int y;
    int x;
    int i,j;

    if ((ret = AndroidBitmap_getInfo(env, bitmapcolor, &infocolor)) < 0) {
        return;
    }

    if ((ret = AndroidBitmap_getInfo(env, bitmapgray, &infogray)) < 0) {
        return;
    }

    if ((ret = AndroidBitmap_lockPixels(env, bitmapcolor, &pixelscolor)) < 0) {
    }

    if ((ret = AndroidBitmap_lockPixels(env, bitmapgray, &pixelsgray)) < 0) {
    }

    // copy pixels to array


    int* arr;
    arr = new int[infocolor.height * infocolor.width * 3* sizeof(int)];

    for (y=0;y<infocolor.height;y++) {
        argb * line = (argb *) pixelscolor;
        argb * grayline = (argb *) pixelsgray;
        for (x=0;x<infocolor.width;x++) {


            arr[x * (infocolor.height * 3) + y * 3 + 1] = line[x].red;
            arr[x * (infocolor.height * 3) + y * 3 + 2] = line[x].green;
            arr[x * (infocolor.height * 3) + y * 3 + 3] = line[x].blue;
            }

        pixelscolor = (char *)pixelscolor + infocolor.stride;
    }

    //do the algorithm on the array of pixels here--------

    //the store the new pixels in the returned bitmap
    AndroidBitmap_unlockPixels(env, bitmapcolor);

    for (y=0;y<infocolor.height;y++) {
            argb * grayline = (argb *) pixelsgray;
            for (x=0;x<infocolor.width;x++) {
                grayline[x].alpha = 255;
                grayline[x].red = arr[x * (infocolor.height * 3) + y * 3 + 1];
                grayline[x].green = arr[x * (infocolor.height * 3) + y * 3 + 2];
                grayline[x].blue = arr[x * (infocolor.height * 3) + y * 3 + 3];
                }

            pixelsgray = (char *)pixelsgray + infocolor.stride;
    }

    AndroidBitmap_unlockPixels(env, bitmapgray);

}
#包括
#包括
#包括
#包括“com_example_ndk_main activity.h”
#包括
#包括
#包括
类型定义结构{
uint8_t红色;
uint8_t绿色;
uint8_t蓝;
uint8_tα;
}argb;
JNIEXPORT void JNICALL Java_com_示例ndk_main activity_invert(JNIEnv*env、jobject obj、jobject bitmapcolor、jobject bitmapgray)
{
AndroidBitmapInfo信息颜色;
void*像素颜色;
AndroidBitmapInfo信息灰色;
void*像素射线;
int ret;
int-y;
int x;
int i,j;
if((ret=AndroidBitmap_getInfo(env、bitmapcolor和infocolor))<0){
返回;
}
if((ret=AndroidBitmap_getInfo(env、bitmapgray和infogray))<0){
返回;
}
if((ret=AndroidBitmap_lockPixels(env、bitmapcolor和pixelscolor))<0){
}
if((ret=AndroidBitmap_lockPixels(env、bitmapgray和pixelsgray))<0){
}
//将像素复制到阵列
int*arr;
arr=newint[infocolor.height*infocolor.width*3*sizeof(int)];

对于(y=0;yy你不能期望人们点击并跟随你的问题/答案链。请尝试重新表述你的新完整问题。如果你指的是
double
s,为什么要使用
jint*
?如果java数组有连续存储保证,你可以尝试将3d数组视为1d。@user3528438你能解释更多吗?g将指针设为[0][0][0]并迭代到末尾