Вы можете использовать java.nio.ByteBuffer
для этого:
ByteBuffer theVideoFrame = ByteBuffer.allocateDirect(frameSize);
...
CopyFrame(theVideoFrame);
И нативный код может быть что-то вроде:
JNIEXPORT void JNICALL Java_blah_blah_blah_CopyFrame(JNIEnv *ioEnv, jobject ioThis, jobject byteBuffer)
{
char *buffer;
buffer = (char*)(ioEnv->GetDirectBufferAddress(byteBuffer));
if (buffer == NULL) {
__android_log_write(ANDROID_LOG_VERBOSE, "foo", "failed to get NIO buffer address");
return;
}
memcpy(buffer, theNativeVideoFrame, frameSize);
}
Чтобы скопировать данные из ByteBuffer
в byte[]
вы бы затем использовать что-то например:
theVideoFrame.get(byteArray);
Спасибо за ваш ответ. Но есть небольшая проблема, правильным вызовом функции может быть 'char * buffer = (* env) -> GetDirectBufferAddress (env, jobj);'. – Jar
О, право. То, как я называл «GetDirectBufferAddress», для C++. В C вы использовали бы то, как вы написали в своем комментарии. – Michael
Я пытаюсь использовать ваш код, я обнаружил, что в C функция выполняется успешно, но обратно в Java бросает ошибку NULL, такой код, «Bitmap mBitmap = Bitmap.createBitmap (w, h, Bitmap.Config.RGB_565)); ByteBuffer mByteBuffer = ByteBuffer.allocateDirect (w * h * 2); getFrame (mByteBuffer); // Это собственная функция mBitmap.copyPixelsFromBuffer (mByteBuffer); // Faild' Это скопированный сбой? – Jar