/** * Return created Java virtual machine using private JNI_GetCreatedJavaVMs * function from the specified library name. * * @param name library name used for symbol lookups, can be NULL * @param log_ctx context used for logging, can be NULL * @return the current Java virtual machine in use */ static JavaVM *get_java_vm(const char *name, void *log_ctx) { JavaVM *vm = NULL; jsize nb_vm = 0; void *handle = NULL; jint (*get_created_java_vms) (JavaVM ** vmBuf, jsize bufLen, jsize *nVMs) = NULL; handle = dlopen(name, RTLD_LOCAL); if (!handle) { return NULL; } get_created_java_vms = (jint (*)(JavaVM **, jsize, jsize *)) dlsym(handle, "JNI_GetCreatedJavaVMs"); if (!get_created_java_vms) { av_log(log_ctx, AV_LOG_ERROR, "Could not find JNI_GetCreatedJavaVMs symbol in library '%s'\n", name); goto done; } if (get_created_java_vms(&vm, 1, &nb_vm) != JNI_OK) { av_log(log_ctx, AV_LOG_ERROR, "Could not get created Java virtual machines\n"); goto done; } done: if (handle) { dlclose(handle); } return vm; }
static JavaVM *get_java_vm(void) { JNI_GetCreatedJavaVMs get_created_java_vms; gpointer handle = NULL; static JavaVM *jvm = NULL; const gchar *error_string; jsize num_jvms = NULL; gint lib_index = 0; gint err; while (android_runtime_libs[lib_index] && !handle) { dlerror(); handle = dlopen(android_runtime_libs[lib_index], RTLD_LOCAL | RTLD_LAZY); error_string = dlerror(); if (error_string) { g_debug("failed to load %s: %s", android_runtime_libs[lib_index], error_string); } if (handle) { g_debug("Android runtime loaded from %s", android_runtime_libs[lib_index]); } else { ++lib_index; } } if (handle) { dlerror(); *(void **) (&get_created_java_vms) = dlsym(handle, "JNI_GetCreatedJavaVMs"); error_string = dlerror(); if (error_string) { g_warning("dlsym(\"JNI_GetCreatedJavaVMs\") failed: %s", error_string); return NULL; } get_created_java_vms(&jvm, 1, &num_jvms); if (num_jvms < 1) { g_debug("get_created_java_vms returned %d jvms", num_jvms); } else { g_debug("found existing jvm"); } err = dlclose(handle); if (err) { g_warning("dlclose() of android runtime handle failed"); } } else { g_error("Failed to get jvm"); } return jvm; }