2016-08-24 54 views
0

我在使用renderscript,当我编写内核时,起初它的行为正常。但是当我更改内核并重建项目时,它不会返回任何内容。有人知道为什么吗?它只是返回一张空白的照片,没有别的。RenderScript行为怪异并且什么都不返回

+0

任何人都可以提供建议或帮助之前,您需要提供更多信息。请参阅[我如何问一个好问题](http://stackoverflow.com/help/how-to-ask)和[如何创建一个最小,完整和可验证的示例](http://stackoverflow.com/help/MCVE)。 –

+0

你可以发布你的源代码,以便我们能够理解它可能会出现什么问题吗? :) – cmaster11

+0

我已修复它。对我来说问题是targetSdkVersion 24。我发现在android 7中,renderscript发生了很多变化,所以我将它改为targetSdkVersion 22并解决了这个问题。代码是来自google文档的示例代码。 @LarrySchiefer – Shahryar

回答

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网站上查看更新的google文档。这里是链接: https://developer.android.com/guide/topics/renderscript/compute.html#writing-an-rs-kernel

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

#define RS_KERNEL __attribute__((kernel)) 

UPDATE 这里是我的gradle产出:

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' 
} 

,我已经根据在此行中使用renderscriptTargetApi 16谷歌的文件:此设置的有效值是从11到最近发布的API级别的任何整数值。如果您的应用程序清单中指定的最低SDK版本被设置为不同的值,则该值将被忽略,并且构建文件中的目标值将用于设置最低SDK版本。

注意:这是现在为我工作的gradle版本。

+0

这个问题很好奇。所以,它适用于22而不是24,对吧?没有涉及代码更改? – cmaster11

+0

是的。没有代码改变。你可以测试它。我已经把整个代码用于测试。测试它,你可以看到。顺便说一句我使用的是android studio 2.1.3。与24你不能在imageview中看到结果过滤器。而且imageview就像它是空白的。@ cmaster11 – Shahryar

+0

谢谢,我会分析这个问题! – cmaster11

相关问题