【问题标题】:Android Bitmap remains unchanged after native C call原生C调用后Android Bitmap保持不变
【发布时间】:2020-11-29 21:14:45
【问题描述】:

这是我第一次在 Android 中使用本机调用,我无法获得图像处理功能的结果。我按照 NDK bitmap-plasma 示例进行操作,但我得到的位图与我发送到 C 代码的位图相同。

在 Java 中我有:

public class ImageProcessing {

    private static native void processImage(Bitmap  bitmap);

    private static Bitmap imgBitmap;

    public static Bitmap imgPrc_loadAndProcess(Uri img_uri, Context context){
        imgBitmap = null;
        try{
            imgBitmap = BitmapUtils.getBitmapFromContentUri(context.getContentResolver(), img_uri);
            processImage(imgBitmap);
            return imgBitmap;
        }catch (Exception e) {
            System.console().printf(e.toString());

        }
        return null;
    }
}

在 C 中:

extern JNIEXPORT void JNICALL Java_com_----_----_----_ImageProcessing_processImage(JNIEnv * env, jclass obj, jobject bitmap)
{
    AndroidBitmapInfo  info;
    void*              pixels;
    int                ret;

    if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return ;
    }

    if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
    }

    ***ImageProcessing stuff that modifies values in *pixels* variable***


    AndroidBitmap_unlockPixels(env, bitmap);

    return ;
}

我检查了 C 代码确实改变了像素变量。提前致谢!

【问题讨论】:

  • , jobject bitmap 您可以更改该变量,但它是调用者位图的副本。不过,您有一些选择。 , jobject *bitmap。如果这不可能,让您的函数返回位图,以便您可以像 imgBitmap=processImage(imgBitmap); 一样调用它。

标签: java android c image-processing java-native-interface


【解决方案1】:

我设法在我的代码中找到了一个问题,该问题将修改后的值保存在像素变量中。修复后,我的问题中的代码确实可以在 Java 中恢复更改。希望这对其他人有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2013-08-09
    相关资源
    最近更新 更多