如何将一个变量的“已处理”值从RenderScript层传递到android v4.1及以上的Java层?

时间:2013-11-27 17:22:12

标签: android renderscript

我正在从Android应用程序向RenderScript(RS)层发送两个变量。 RS层中定义的函数接受并添加这两个变量,并将结果存储在第三个变量中。现在,我想在应用程序空间中获取此result_variable的值。 (Android版本4.1 +)

PS:我已尝试在RS层(as suggested by Google)中使用全局指针来实现相同的功能,但没有用。

2 个答案:

答案 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设置)为未来读者寻求答案:

  1. 从RenderScript 调用以下API(注意:这需要在您的rs文件中包含“rs_core.rsh”

    rsSendToClient(cmdID, &data, sizeof(data));

  2. 在您的Java文件中,定义RSMessageHandler并覆盖其 run()方法,并在 cmdID上放置一个switch-case结构设置 rsSendToClient 。然后,使用RenderScript链接/设置此处理程序:

    mRenderScript.setMessageHandler(mRSMessageHandler);

    This answer提供了更多详细信息。

  3. 我还就如何使用从RenderScript发送到Java图层的数据的上述答案发表了评论。

    希望这会清除将“已处理”数据从RenderScript传递到Java层的方法。