58 if ((*vm)->GetEnv(vm, (
void**) &env, JNI_VERSION_1_6) != JNI_OK) {
71 logMethod = (*env)->GetStaticMethodID(env, clazz,
"log",
"([B)V");
73 LOGE(
"OnLoad thread failed to GetMethodID for %s.",
"log");
74 (*globalVm)->DetachCurrentThread(
globalVm);
78 if ((*env)->RegisterNatives(env, clazz,
logMethods, 2) < 0) {
83 logClass = (jclass) ((*env)->NewGlobalRef(env, clazz));
85 return JNI_VERSION_1_6;
96 jint getEnvRc = (*globalVm)->GetEnv(
globalVm, (
void**) &env, JNI_VERSION_1_6);
97 if (getEnvRc != JNI_OK) {
98 if (getEnvRc != JNI_EDETACHED) {
99 LOGE(
"Log thread failed to GetEnv for class %s with rc %d.",
logClassName, getEnvRc);
103 if ((*globalVm)->AttachCurrentThread(
globalVm, &env, NULL) != 0) {
104 LOGE(
"Log thread failed to AttachCurrentThread for class %s.",
logClassName);
109 LOGI(
"Native log thread started.");
113 if (buffer[readSize - 1] ==
'\n') {
116 buffer[readSize] = 0;
118 jbyteArray byteArray = (jbyteArray) (*env)->NewByteArray(env, readSize);
119 (*env)->SetByteArrayRegion(env, byteArray, 0, readSize, (jbyte *)buffer);
121 (*env)->DeleteLocalRef(env, byteArray);
125 (*globalVm)->DetachCurrentThread(
globalVm);
127 LOGI(
"Native log thread stopped.");
143 setvbuf(stdout, 0, _IOLBF, 0);
144 setvbuf(stderr, 0, _IONBF, 0);
154 LOGE(
"Failed to create native log thread (rc=%d).", rc);
172 LOGI(
"Stopping native log thread\n");
jint JNI_OnLoad(JavaVM *vm, void *reserved)
static pthread_t logThread
static jmethodID logMethod
JNINativeMethod logMethods[]
JNIEXPORT jint JNICALL Java_com_arthenica_mobileffmpeg_Log_stopNativeCollector(JNIEnv *env, jobject object)
const char * logClassName
JNIEXPORT jint JNICALL Java_com_arthenica_mobileffmpeg_Log_startNativeCollector(JNIEnv *env, jobject object)
static int logThreadEnabled
static void * logThreadFunction()