【问题标题】:The fastest way to pass java bitmap pixels to jni将java位图像素传递给jni的最快方法
【发布时间】:2015-09-16 08:20:03
【问题描述】:

我正在尝试找到将位图从 java 传递到 JNI 的最佳/最快方法。接下来是我目前如何进行此操作。这可以改进吗,或者有其他更快的方法吗?

void JNIBitmap::setBuffer(JNIEnv* env, const jobject bitmap)
{
    // Allocate native pixels buffer

    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env, bitmap, &bitmapInfo)

    this->bufferWidth  = bitmapInfo.width;
    this->bufferHeight = bitmapInfo.height;
    this->bufferSize   = this->bufferWidth * this->bufferHeight * 4;
    this->buffer       = new uint8_t[this->bufferSize];

    // Copy pixels to native buffer

    void* bitmapPixels;
    AndroidBitmap_lockPixels(env, bitmap, &bitmapPixels)

    memcpy((void*)this->buffer, bitmapPixels, this->bufferSize);

    AndroidBitmap_unlockPixels(env, bitmap);
}

【问题讨论】:

  • 更快的方法是不复制像素。据我了解,您锁定的是像素缓冲区地址,而不是位图,这意味着位图可以继续使用,并且保证不会在内存中移动。

标签: java android bitmap android-ndk java-native-interface


【解决方案1】:

最简单的方法是调用 AndroidBitmap_lockPixels。 所以在 JNIBitmap 的构造函数中你会这样做:

void* bitmapPixels;
AndroidBitmap_lockPixels(env, bitmap, &bitmapPixels)

然后在析构函数中你会这样做:

AndroidBitmap_unlockPixels( env, bitmap);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多