Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.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
如何将位图从Java传递到C++;在Android开发中使用JNI? 我想把Android的一个位图传递给C++,使用JNI进行Android开发。_Android_C++_Java Native Interface - Fatal编程技术网

如何将位图从Java传递到C++;在Android开发中使用JNI? 我想把Android的一个位图传递给C++,使用JNI进行Android开发。

如何将位图从Java传递到C++;在Android开发中使用JNI? 我想把Android的一个位图传递给C++,使用JNI进行Android开发。,android,c++,java-native-interface,Android,C++,Java Native Interface,在Java中,我调用此函数将位图从Java发送到C++: public native int sendMyBitmap(Bitmap bitmap); 在JNI,我是这样做的: JNIEXPORT void JNICALL sendMyBitmap(JNIEnv * env, jobject obj, jobject bitmap) { AndroidBitmapInfo androidBitmapInfo ; void* pixels; Androi

在Java中,我调用此函数将位图从Java发送到C++:

public native int sendMyBitmap(Bitmap bitmap);
在JNI,我是这样做的:

JNIEXPORT void JNICALL sendMyBitmap(JNIEnv * env,
        jobject obj, jobject bitmap) 
{
    AndroidBitmapInfo androidBitmapInfo ;
    void* pixels;
    AndroidBitmap_getInfo(env, bitmap, &androidBitmapInfo);
    AndroidBitmap_lockPixels(env, bitmap, &pixels);
    unsigned char* pixelsChar = (unsigned char*) pixels;
    saveImage(pixelsChar);
}

void saveImage(unsigned char* img)
{
    FILE *f;
    int w = 640, h = 480;

    int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int

    unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
    unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};
    unsigned char bmppad[3] = {0,0,0};

    bmpfileheader[ 2] = (unsigned char)(filesize    );
    bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
    bmpfileheader[ 4] = (unsigned char)(filesize>>16);
    bmpfileheader[ 5] = (unsigned char)(filesize>>24);

    bmpinfoheader[ 4] = (unsigned char)(       w    );
    bmpinfoheader[ 5] = (unsigned char)(       w>> 8);
    bmpinfoheader[ 6] = (unsigned char)(       w>>16);
    bmpinfoheader[ 7] = (unsigned char)(       w>>24);
    bmpinfoheader[ 8] = (unsigned char)(       h    );
    bmpinfoheader[ 9] = (unsigned char)(       h>> 8);
    bmpinfoheader[10] = (unsigned char)(       h>>16);
    bmpinfoheader[11] = (unsigned char)(       h>>24);

    f = fopen("/storage/test.png","wb");
    fwrite(bmpfileheader,1,14,f);
    fwrite(bmpinfoheader,1,40,f);
    for(int i=0; i<h; i++)
    {
        fwrite(img+(w*(h-i-1)*3),3,w,f);
        fwrite(bmppad,1,(4-(w*3)%4)%4,f);
    }
    fflush(f);
    fclose(f);
}
JNIEXPORT void JNICALL sendMyBitmap(JNIEnv*env,
jobject对象,jobject位图)
{
AndroidBitmapInfo AndroidBitmapInfo;
空*像素;
AndroidBitmap_getInfo(环境、位图和androidBitmapInfo);
AndroidBitmap_锁定像素(环境、位图和像素);
无符号字符*pixelsChar=(无符号字符*)像素;
保存图像(像素);
}
void saveImage(无符号字符*img)
{
文件*f;
int w=640,h=480;
int filesize=54+3*w*h;//w是图像宽度,h是图像高度,两者都是int
无符号字符bmpfileheader[14]={'B','M',0,0,0,0,0,0,54,0,0,0,0,0};
无符号字符bmpinfoheader[40]={40,0,0,0,0,0,0,0,0,0,0,1,0,24,0};
无符号字符bmppad[3]={0,0,0};
bmpfileheader[2]=(无符号字符)(文件大小);
bmpfileheader[3]=(无符号字符)(文件大小>>8);
bmpfileheader[4]=(无符号字符)(文件大小>>16);
bmpfileheader[5]=(无符号字符)(文件大小>>24);
bmpinfoheader[4]=(无符号字符)(w);
bmpinfoheader[5]=(无符号字符)(w>>8);
bmpinfoheader[6]=(无符号字符)(w>>16);
bmpinfoheader[7]=(无符号字符)(w>>24);
bmpinfoheader[8]=(无符号字符)(h);
bmpinfoheader[9]=(无符号字符)(h>>8);
bmpinfoheader[10]=(无符号字符)(h>>16);
bmpinfoheader[11]=(无符号字符)(h>>24);
f=fopen(“/storage/test.png”,“wb”);
fwrite(bmpfileheader,1,14,f);
fwrite(bmpinfoheader,1,40,f);
对于(int i=0;i这一行:

fwrite(img + (w * (h - i - 1)*3), 3, w, f);
您假设输入位图每像素有24位(3字节),但android中没有这种像素格式

您还假设宽度正好是640像素,高度正好是480像素。在您的情况下,这可能是事实,但您应该阅读此信息,而不是硬编码值

所有这些值都是由函数
AndroidBitmap\u getInfo()
提供的。为什么不使用它们?只需检查结构
AndroidBitmapInfo

typedef struct {
    uint32_t    width;
    uint32_t    height;
    uint32_t    stride;
    int32_t     format;
    uint32_t    flags;      // 0 for now
} AndroidBitmapInfo;
您可以直接读取位图的尺寸。此外,您应该检查参数
format
,该参数可以是以下值之一:

enum AndroidBitmapFormat {
    ANDROID_BITMAP_FORMAT_NONE      = 0,
    ANDROID_BITMAP_FORMAT_RGBA_8888 = 1,
    ANDROID_BITMAP_FORMAT_RGB_565   = 4,
    ANDROID_BITMAP_FORMAT_RGBA_4444 = 7,
    ANDROID_BITMAP_FORMAT_A_8       = 8,
};

<>代码>没有RebBy88格式。你应该确保你在java代码C++中发送的代码是<<代码> RGBAY88 88 < /代码>像素格式,并相应地修改你的算法。我认为将输出像素格式改为32位(而不是24位)更容易。请描述预期结果与实际结果。