« なぜ JPEG XR ? | メイン | RenderScript の invoke は非同期実行 »

2014年06月09日

Android:: invoke で呼び出すシンプルな RenderScript

    

RenderScript は、非同期で実行され、非 static 関数が返り値を持つことは出来ない。
RenderScript 自体は、C言語(C99)で記述可能。

ネット上には実際に使用しているサンプルが極端に少ない。
と言うことで、シンプルな RenderScript を書いてみる。

test.rs

#pragma version(1)
#pragma rs java_package_name(com.your.package.name)
#pragma rs_fp_relaxed
static int result[1];
void add( int a, int b ) {
  result[0] = a + b;
  rsSendToClient(1,result,1);
}

加算して、値を返す関数を定義した RenderScript 。
この test.rs は、以下のように書けそうな気がする。

int value;
void add( int a, int b ) {
  value = value + a + b;
}

でも、うまくいかない。
value に入れた値を取得できない。
もしかしたら何か方法があるのかもしれないが、わからない。

話を戻して、Java の呼び出し側は以下のような形。

mRS = RenderScript.create(this);
mScript = new ScriptC_test(mRS);
mRS.setMessageHandler( new RSMessageHandler() {
  public void run() {
    switch( mID ) {
    case 1: {
      int result = mData[0];
      Log.v( "Result:", "value:"+result);
      break;
    }
    }
  }
});
mScript.invoke_add( 10, 20 );

RenderScript の rsSendToClient でクライアント(Java)側に通知を送れるので、Java 側でそれを受けてログに出力している。
ここまでわかれば、好きな C関数を RenderScript 化して Java から楽に呼び出せる。
ただ、RenderScript は malloc が使えない(Java側で確保して渡す形)ので、malloc が必要な処理は難しい。

うまくいかないパターンの補足
RenderScript.finish で完了を待つっぽいこと書いているけど、これで待ってもうまくいかない。
RenderScript は、非同期実行なので、他の何か完了待ちが必要か、値を Java 側からアクセスできるようにコピーする処理が走るタイミングがありそうだけど、invoke 系ではそれがうまく働かないのかもしれない。
rsForEach 系が必要なのだろうか。
この辺りは rsForEach 系を使う時に調査しようと思う。



投稿者 Takenori : 2014年06月09日 20:18




comments powered by Disqus
Total : Today : Yesterday : なかのひと