RenderScript表现得很奇怪并且什么也没有返回

时间:2016-08-24 06:50:09

标签: android renderscript

我使用renderscript,当我编写内核时,起初它表现正常。但是当我更改内核并重建项目时,它什么也没有返回。谁知道为什么?它只返回一张空白的照片,而不是别的。

1 个答案:

答案 0 :(得分:1)

我修好了。对我来说问题是targetSdkVersion 24。我发现在android 7中,renderscript有很多变化(NEW FEATURES),所以我把它改成了targetSdkVersion 22并修复了这个问题。我试着做一个简单的过滤器,使用过滤器后它在imageview中没有显示任何内容。但当我将targetSdkVersion更改为22时,它修复了问题,我可以在imageview中看到过滤后的图像。这是我用过的代码:

uchar4 __attribute__((kernel)) filtered(uchar4 in, uint32_t x, uint32_t y) {

uchar4 out = in;
 out.r = 255 - in.r;
 out.g = 255 - in.g;
 out.b = 255 - in.b;
 return out;
}

如果您感兴趣,可以使用targetSdkVersion 24和22进行尝试。这里是java部分的代码:

public void imageFilter(Bitmap bmp) {

    doAllocation();

    operationBitmap = Bitmap.createBitmap(bmp.getWidth(),
            bmp.getHeight(), bmp.getConfig());

    int height = operationBitmap.getHeight();
    int width = operationBitmap.getWidth();

    Toast.makeText(MainActivity.this, width + " x " + height, Toast.LENGTH_SHORT).show();

    ScriptC_cnn cnnScript = new ScriptC_cnn(rs);
    cnnScript.forEach_filtered(allocIn, allocOut);

    allocOut.copyTo(operationBitmap);
    selectedImagePreview.setImageBitmap(operationBitmap);
    rs.destroy();
}

public void doAllocation() {

        allocIn = Allocation.createFromBitmap(rs, originalBitmap,
                Allocation.MipmapControl.MIPMAP_NONE,
                Allocation.USAGE_SCRIPT);

        allocOut = Allocation.createTyped(rs,
                allocIn.getType());
}

你可以在developer.android网站上看到谷歌的续订文件。链接在这里: https://developer.android.com/guide/topics/renderscript/compute.html#writing-an-rs-kernel

您可以看到,对于映射内核,您可以使用RS_KERNEL而不是属性((内核))。谷歌提到RS_KERNEL是一个由RenderScript自动定义的宏,方便您使用:

#define RS_KERNEL __attribute__((kernel))

<强>更新 这是我的傻瓜:

android {
compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
    applicationId "shahryar.com.cellularneuralnetwork"
    minSdkVersion 16
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
    renderscriptSupportModeEnabled true;
    renderscriptTargetApi 16;
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
}

我在google的文档中根据此行使用了renderscriptTargetApi 16:此设置的有效值是从11到最近发布的API级别的任何整数值。如果应用程序清单中指定的最低SDK版本设置为其他值,则忽略该值,并使用构建文件中的目标值设置最低SDK版本。

注意:这是我现在正在使用的gradle版本。