/* * Copyright (C) NGINX, Inc. */ #include #include #include "nxt_jni_URLClassLoader.h" static jclass nxt_java_URLClassLoader_class; static jmethodID nxt_java_URLClassLoader_ctor; static jmethodID nxt_java_URLClassLoader_parent_ctor; static jmethodID nxt_java_URLClassLoader_loadClass; static jmethodID nxt_java_URLClassLoader_addURL; static jclass nxt_java_URL_class; static jmethodID nxt_java_URL_ctor; int nxt_java_initURLClassLoader(JNIEnv *env) { jclass cls; cls = (*env)->FindClass(env, "java/net/URLClassLoader"); if (cls == NULL) { nxt_unit_warn(NULL, "java.net.URLClassLoader not found"); return NXT_UNIT_ERROR; } nxt_java_URLClassLoader_class = (*env)->NewGlobalRef(env, cls); (*env)->DeleteLocalRef(env, cls); cls = nxt_java_URLClassLoader_class; nxt_java_URLClassLoader_ctor = (*env)->GetMethodID(env, cls, "", "([Ljava/net/URL;)V"); if (nxt_java_URLClassLoader_ctor == NULL) { nxt_unit_warn(NULL, "java.net.URLClassLoader constructor not found"); goto failed; } nxt_java_URLClassLoader_parent_ctor = (*env)->GetMethodID(env, cls, "", "([Ljava/net/URL;Ljava/lang/ClassLoader;)V"); if (nxt_java_URLClassLoader_ctor == NULL) { nxt_unit_warn(NULL, "java.net.URLClassLoader constructor not found"); goto failed; } nxt_java_URLClassLoader_loadClass = (*env)->GetMethodID(env, cls, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); if (nxt_java_URLClassLoader_loadClass == NULL) { nxt_unit_warn(NULL, "java.net.URLClassLoader.loadClass not found"); goto failed; } nxt_java_URLClassLoader_addURL = (*env)->GetMethodID(env, cls, "addURL", "(Ljava/net/URL;)V"); if (nxt_java_URLClassLoader_addURL == NULL) { nxt_unit_warn(NULL, "java.net.URLClassLoader.addURL not found"); goto failed; } cls = (*env)->FindClass(env, "java/net/URL"); if (cls == NULL) { nxt_unit_warn(NULL, "java.net.URL not found"); return NXT_UNIT_ERROR; } nxt_java_URL_class = (*env)->NewGlobalRef(env, cls); (*env)->DeleteLocalRef(env, cls); cls = nxt_java_URL_class; nxt_java_URL_ctor = (*env)->GetMethodID(env, cls, "", "(Ljava/lang/String;)V"); if (nxt_java_URL_ctor == NULL) { nxt_unit_warn(NULL, "java.net.URL constructor not found"); goto failed; } return NXT_UNIT_OK; failed: (*env)->DeleteGlobalRef(env, cls); return NXT_UNIT_ERROR; } jobject nxt_java_newURLClassLoader(JNIEnv *env, int url_count, char **urls) { jobjectArray jurls; jurls = nxt_java_newURLs(env, url_count, urls); if (jurls == NULL) { return NULL; } return (*env)->NewObject(env, nxt_java_URLClassLoader_class, nxt_java_URLClassLoader_ctor, jurls); } jobject nxt_java_newURLClassLoader_parent(JNIEnv *env, int url_count, char **urls, jobject parent) { jobjectArray jurls; jurls = nxt_java_newURLs(env, url_count, urls); if (jurls == NULL) { return NULL; } return (*env)->NewObject(env, nxt_java_URLClassLoader_class, nxt_java_URLClassLoader_parent_ctor, jurls, parent); } jobjectArray nxt_java_newURLs(JNIEnv *env, int url_count, char **urls) { int i; jstring surl; jobject jurl; jobjectArray jurls; jurls = (*env)->NewObjectArray(env, url_count, nxt_java_URL_class, NULL); if (jurls == NULL) { return NULL; } for (i = 0; i < url_count; i++) { surl = (*env)->NewStringUTF(env, urls[i]); if (surl == NULL) { return NULL; } jurl = (*env)->NewObject(env, nxt_java_URL_class, nxt_java_URL_ctor, surl); if (jurl == NULL) { return NULL; } (*env)->SetObjectArrayElement(env, jurls, i, jurl); } return jurls; } jclass nxt_java_loadClass(JNIEnv *env, jobject cl, const char *name) { jstring jname; jname = (*env)->NewStringUTF(env, name); if (jname == NULL) { return NULL; } return (*env)->CallObjectMethod(env, cl, nxt_java_URLClassLoader_loadClass, jname); } void nxt_java_addURL(JNIEnv *env, jobject cl, const char *url) { jstring surl; jobject jurl; surl = (*env)->NewStringUTF(env, url); if (surl == NULL) { return; } jurl = (*env)->NewObject(env, nxt_java_URL_class, nxt_java_URL_ctor, surl); if (jurl == NULL) { return; } (*env)->CallVoidMethod(env, cl, nxt_java_URLClassLoader_addURL, jurl); }