【问题标题】:How to call postinvalidate from android native code on bitmap如何从位图上的android本机代码调用postinvalidate
【发布时间】:2023-04-10 17:57:01
【问题描述】:

我有一个从 java 代码创建的位图,并从本机代码更新像素。我只是想知道我们是否可以从本机代码中调用 invalidate。

我的代码如下。

C 代码:

AndroidBitmapInfo  info;
void*              pixels;
int                ret;

if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
return;
}

if (info.format != ANDROID_BITMAP_FORMAT_RGB_565) {
return;
}

if ((ret =AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
}

memcpy(pixels, pictureRGB, 480*320);

AndroidBitmap_unlockPixels(env, bitmap);

Java 代码

     Bitmap mBitmap = Bitmap.createBitmap(480, 320, Bitmap.Config.RGB_565);
     renderbitmap(mBitmap, 0);
     canvas.drawBitmap(mBitmap, 0, 0, null);

【问题讨论】:

  • 您不想从 C 中回调 Java 代码来这样做吗?应该不是问题。

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


【解决方案1】:

什么是无效?上面的C代码实现了哪个功能?

【讨论】:

    【解决方案2】:

    我从互联网上得到的唯一可能的答案是使用 env 指针并将其用作 env->postInvalidate();

    【讨论】:

      【解决方案3】:

      如果您的本机代码正在执行原子操作,那么从您的 Java 代码中调用 postInvalidate() 会更容易。

      renderbitmap(mBitmap, 0);
      postInvalidate();
      

      您还应该考虑让您的本机代码直接在位图内存上工作,而不是分配另一个内存块,然后必须将其 memcpy() 到您的位图中。这会因为 CPU 缓存利用率低而损害性能。

      【讨论】:

        猜你喜欢
        • 2017-07-30
        • 2012-05-31
        • 1970-01-01
        • 2020-05-10
        • 2014-07-27
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        相关资源
        最近更新 更多