Beispiel #1
0
/**
 * 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;
}
Beispiel #2
0
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;
}