我正在从Android应用程序向RenderScript(RS)层发送两个变量。 RS层中定义的函数接受并添加这两个变量,并将结果存储在第三个变量中。现在,我想在应用程序空间中获取此result_variable的值。 (Android版本4.1 +)
PS:我已尝试在RS层(as suggested by Google)中使用全局指针来实现相同的功能,但没有用。
答案 0 :(得分:1)
您应该使用分配在双方之间传输数据(Java和RenderScript)。如果使用简单函数在.rs文件中声明rs_allocation:
rs_allocation ai;
void foo() {
int i = rsGetElementAt_int(ai, 0);
rsSetElementAt_int(ai, i + 1, 0);
}
然后,您可以从Java端创建并附加适当的分配:
RenderScript mRS = RenderScript.create(mCtx);
ScriptC_s mScript = new ScriptC_s(mRS);
Type t = new Type.Builder(mRS, Element.I32(mRS)).setX(1).create();
Allocation ai1 = Allocation.createTyped(mRS, t);
int i1[] = new int[1];
mScript.set_ai(ai1);
i1[0] = 777;
ai1.copyFrom(i1); // Copies contents of i1 into ai1 Allocation
mScript.invoke_foo();
ai1.copyTo(i1); // Copies contents of ai1 back to i1
// i1[0] now has the value 778
显然,您也可以使用更大的多维缓冲区,但只需使用Java中的1维访问它们。您还可以从内核读取/写入这些缓冲区(因此将Allocation参数分配给forEach函数)。
答案 1 :(得分:0)
通过以下几条Google链接和少量SO链接找到答案。 我将尝试总结它(考虑到你已经在这方面有基本的renderscript设置)为未来读者寻求答案:
从RenderScript 调用以下API(注意:这需要在您的rs文件中包含“rs_core.rsh”)
rsSendToClient(cmdID, &data, sizeof(data));
在您的Java文件中,定义RSMessageHandler
并覆盖其 run()方法,并在 cmdID上放置一个switch-case结构设置
rsSendToClient 。然后,使用RenderScript链接/设置此处理程序:
mRenderScript.setMessageHandler(mRSMessageHandler);
This answer提供了更多详细信息。
我还就如何使用从RenderScript发送到Java图层的数据的上述答案发表了评论。
希望这会清除将“已处理”数据从RenderScript传递到Java层的方法。