W Renderscript systemu Android, używając struktury rs_script_call do ograniczenia zakresu alokacji, która jest obsługiwana podczas połączenia rsForEach

Korzystając z RenderScript systemu Android, próbuję ograniczyć zakres alokacji obsługiwanej podczas wywołania rsForEach. Zgodnie z dokumentacją można to osiągnąć, przekazując strukturę rs_script_call, ale za każdym razem, gdy próbuję, aplikacja ulega awarii.

Jak poprawnie konfiguruje się strukturę rs_script_call i przekazuje ją do wywołania rsForEach?

Używam przykładu HelloCompute RenderScript jako podstawy kodu. Minimalna wersja sdk systemu Android jest ustawiona na 15, a zatem za pomocą rsForEach, który pobiera 6 argumentów. Oto dostosowany mono.rs:

<code>#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.hellocompute)

const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};

void init() {
}

void root(const uchar4 *v_in, uchar4 *v_out) {
    float4 f4 = rsUnpackColor8888(*v_in);

    float3 mono = dot(f4.rgb, gMonoMult);
    *v_out = rsPackColorTo8888(mono);
}

void runRestricted(rs_script script, rs_allocation in_alloc, rs_allocation out_alloc) {
     struct rs_script_call restrict_for;
     restrict_for.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
     restrict_for.xStart = 0;
     restrict_for.xEnd = 16;
     restrict_for.yStart = 0;
     restrict_for.yEnd = 0;
     restrict_for.zStart = 0;
     restrict_for.zEnd = 0;
     restrict_for.arrayStart = 0;
     restrict_for.arrayEnd = 0;
     rsForEach(script, in_alloc, out_alloc, NULL, 0, &restrict_for);
     //rsForEach(script, in_alloc, out_alloc);
}
</code>

Nazwany z następującej Java:

<code>mRS = RenderScript.create(this);

mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
                                                Allocation.MipmapControl.MIPMAP_NONE,
                                                Allocation.USAGE_SCRIPT);
mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());

mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);

//mScript.forEach_root(mInAllocation, mOutAllocation);
mScript.invoke_runRestricted(mScript, mInAllocation, mOutAllocation);
mOutAllocation.copyTo(mBitmapOut);
</code>

Oto część dziennika aplikacji działającej na Nexusie S z Androidem 4.0.4:

<code>04-12 00:27:25.632: V/RenderScript(18747): rsContextCreate dev=0x18798c0
04-12 00:27:25.636: V/RenderScript(18747): 0x183b6a0 Launching thread(s), CPUs 1
04-12 00:27:25.656: V/ScriptC(18747): Create script for resource = mono
04-12 00:27:25.656: I/bcc(18747): LIBBCC build time: 2012/03/25 20:11:25
04-12 00:27:25.656: I/bcc(18747): LIBBCC build revision: 31e50d678d2a8aa28c6f38cccebfa3da2f78df4a (git)
04-12 00:27:25.675: D/StopWatch(18747): StopWatch calcFileSHA1 time (us): 17709 
04-12 00:27:25.679: D/StopWatch(18747): StopWatch calcFileSHA1 time (us): 2350 
04-12 00:27:25.679: D/bcc(18747): Read object file size 1020
04-12 00:27:25.679: E/RenderScript(18747): ScriptC sym lookup failed for _Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call
04-12 00:27:25.679: E/bcc(18747): Unable to resolve symbol: _Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call
04-12 00:27:25.679: D/StopWatch(18747): StopWatch bcc: PrepareExecutable time (us): 1284 
04-12 00:27:25.679: E/bcc(18747): Symbol not found: .rs.dtor
04-12 00:27:25.683: A/libc(18747): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
</code>

questionAnswers(0)

yourAnswerToTheQuestion