コードハイライト用

せっかく無職になったから、働いてる時に忙しくて出来なかった色々な事をやってみようと場当たり的に始めたブログ。 だったけど就職決まっちゃいました。

2012年2月27日月曜日

[Android][NDK] CからJavaに配列を渡して書き込んでもらう

ググってたら CallStaticByteMethod での戻り値をそのまま jbyteArray にキャストして使ってるのもあったけど
なんか怖いのでちゃんと配列の型でできないかとやってみた。

Java 側の FromC#loadFile(String filename, byte[] outBuffer) を呼び出しています。

また部分抜き出しなので不明な定義があります。(buffSize やら pBuffer やら)

// ファイル名オブジェクト生成
jstring js = charToJstring(env, pFileName);  // const char* -> jstring
// 受取り用バッファオブジェクト生成
jbyteArray ba = env->NewByteArray(buffSize);
jbyte* pArray = NULL;

if (js && ba)
{
 // クラスを取得
 jclass classObj = env->FindClass( "FromC" );
 jmethodID method = env->GetStaticMethodID(classObj, "loadFile", "(Ljava/lang/String;[B)Z");
 
 do {
  if (method == NULL) {
   LOGE( "method null" );
   break;
  }

  bool result = env->CallStaticBooleanMethod(classObj, method, js, ba);
  if (result == false) {
   LOGE( "failed loadFile" );
   break;
  }

  jboolean isCopy = JNI_FALSE;
  pArray = env->GetByteArrayElements(ba, &isCopy);
  if (isCopy == JNI_TRUE) {
   // TODO
  }

  jsize arraySize = env->GetArrayLength( ba );
  if (pArray && arraySize <= buffSize) {
   
   // 受取り用バッファにコピー
   memcpy( pBuffer, pArray, arraySize );
   
  } else {
   LOGE( "failed copy pArray:0x%08x arraySize:%d", pArray, arraySize );
  }
 } while(0);
 
 env->DeleteLocalRef( classObj );
}

env->DeleteLocalRef( js );
env->ReleaseByteArrayElements(ba, pArray, JNI_ABORT);

LOGD( "file dump %x %x %x %x %x %x %x %x %x %x", 
  pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3], pBuffer[4], pBuffer[5], pBuffer[6], pBuffer[7], pBuffer[8], pBuffer[9] );

0 件のコメント:

コメントを投稿