ググってたら 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] );