我正在学习如何使用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
是否可以在RS上动态分配内存?而不是从Java这样做?
如果可能,该内存是堆的一部分,还是设备的全局可用RAM的一部分?当Java上的Renderscript对象被GC编辑时,它会自动GC吗?
RS中设置的所有静态变量怎么样?它们是堆的一部分吗?
一旦Java上的Renderscript对象得到GC编辑,是否会像GC一样自动释放RS的各种分配?
我问这个是因为对文档的一些奇怪的解释。
答案 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。