是否可以在Renderscript中分配内存?

时间:2015-10-05 11:58:16

标签: android memory renderscript

背景

我正在学习如何使用Renderscript,我在文档中找到了这个部分:

http://developer.android.com/guide/topics/renderscript/advanced.html#mem-allocation

  

为了支持这种内存分配系统,有一组API   允许Android VM分配内存并提供类似的功能   malloc调用的功能。

     

...

     

为了更好地理解这些类是如何工作的,想一想是有用的   它们与一个简单的malloc调用相关,如下所示:

     

array =(int *)malloc(sizeof(int)* 10);

问题

我无法理解:如果我想在RS内部分配内存怎么办?

例如,假设我需要进行与输入和输出相比需要大量内存的计算,我可以在RS本身内部而不是从Java中完成吗?

我尝试了什么

我甚至无法成功创建一个新数组,即使它是恒定的数组:

static int array[1024*1024*100] ; //this is ok

void init() {
   rsDebug("init called. array check:",(int)(*array));
   array[0] = 2; // this is not ok
   rsDebug("init called. array check:",(int)(*array));
}

我得到的所有代码都是这个错误:

  

错误:任务':app:compileDebugRenderscript'执行失败。

     
    

com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:进程'命令     'D:\ android \ Sdk \ build-tools \ 22.0.1 \ llvm-rs-cc.exe''完成了     非零退出值-1073741819

  

问题

  1. 是否可以在RS上动态分配内存?而不是从Java这样做?

  2. 如果可能,该内存是堆的一部分,还是设备的全局可用RAM的一部分?当Java上的Renderscript对象被GC编辑时,它会自动GC吗?

  3. RS中设置的所有静态变量怎么样?它们是堆的一部分吗?

  4. 一旦Java上的Renderscript对象得到GC编辑,是否会像GC一样自动释放RS的各种分配?

    我问这个是因为对文档的一些奇怪的解释。

2 个答案:

答案 0 :(得分:0)

不,使用malloc()是不可能的;你错误地阅读了文档。

它没有说API malloc(),它说就像 malloc()。您链接的同一页面继续显示此示例代码:

//Create an element manually and allocate memory for the int pointer
intPointer = Allocation.createSized(myRenderScript, Element.I32(myRenderScript), 2);

哪个不会投射,但也看起来不像是C代码。

答案 1 :(得分:0)

无法在.rs文件中分配内存。您需要在Java / C ++中完成所有分配,然后将其传递给RS。