in src/JNI/com/amazonaws/kinesis/video/producer/jni/KinesisVideoClientWrapper.cpp [2114:2200]
STATUS KinesisVideoClientWrapper::putStreamFunc(UINT64 customData,
PCHAR streamName,
PCHAR containerType,
UINT64 streamStartTime,
BOOL absoluteFragmentTimestamp,
BOOL ackRequired,
PCHAR streamingEndpoint,
PServiceCallContext pCallbackContext)
{
DLOGS("TID 0x%016" PRIx64 " putStreamFunc called.", GETTID());
KinesisVideoClientWrapper *pWrapper = FROM_WRAPPER_HANDLE(customData);
CHECK(pWrapper != NULL);
// Get the ENV from the JavaVM
JNIEnv *env;
BOOL detached = FALSE;
STATUS retStatus = STATUS_SUCCESS;
jstring jstrStreamName = NULL, jstrContainerType = NULL, jstrStreamingEndpoint = NULL;
jbyteArray authByteArray = NULL;
INT32 envState = pWrapper->mJvm->GetEnv((PVOID*) &env, JNI_VERSION_1_6);
if (envState == JNI_EDETACHED) {
ATTACH_CURRENT_THREAD_TO_JVM(env);
// Store the detached so we can detach the thread after the call
detached = TRUE;
}
// Call the Java func
jstrStreamName = env->NewStringUTF(streamName);
jstrContainerType = env->NewStringUTF(containerType);
jstrStreamingEndpoint = env->NewStringUTF(streamingEndpoint);
authByteArray = env->NewByteArray(pCallbackContext->pAuthInfo->size);
if (jstrStreamName == NULL ||
jstrContainerType == NULL ||
jstrStreamingEndpoint == NULL ||
authByteArray == NULL) {
retStatus = STATUS_NOT_ENOUGH_MEMORY;
goto CleanUp;
}
// Copy the bits into the managed array
env->SetByteArrayRegion(authByteArray,
0,
pCallbackContext->pAuthInfo->size,
(const jbyte*) pCallbackContext->pAuthInfo->data);
// Invoke the callback
retStatus = env->CallIntMethod(pWrapper->mGlobalJniObjRef,
pWrapper->mPutStreamMethodId,
jstrStreamName,
jstrContainerType,
streamStartTime,
absoluteFragmentTimestamp == TRUE,
ackRequired == TRUE,
jstrStreamingEndpoint,
pCallbackContext->callAfter,
pCallbackContext->timeout,
authByteArray,
pCallbackContext->pAuthInfo->type,
pCallbackContext->customData
);
CHK_JVM_EXCEPTION(env);
CleanUp:
if (jstrStreamName != NULL) {
env->DeleteLocalRef(jstrStreamName);
}
if (jstrContainerType != NULL) {
env->DeleteLocalRef(jstrContainerType);
}
if (authByteArray != NULL) {
env->DeleteLocalRef(authByteArray);
}
// Detach the thread if we have attached it to JVM
if (detached) {
pWrapper->mJvm->DetachCurrentThread();
}
return retStatus;
}