C NDK-阵列分配/解除分配
我想将位图像素复制到一个3D数组中,并从这个3D数组中为特定的图像处理算法分配新的数组。我的代码将涉及使用MD数组最多。我想要一种高效的方法,快速且无内存开销/泄漏 以下是我当前的Cpp代码: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>
#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]并迭代到末尾