1*977Smax.romanov@gmail.com 2*977Smax.romanov@gmail.com /* 3*977Smax.romanov@gmail.com * Copyright (C) NGINX, Inc. 4*977Smax.romanov@gmail.com */ 5*977Smax.romanov@gmail.com 6*977Smax.romanov@gmail.com #include <nxt_unit.h> 7*977Smax.romanov@gmail.com #include <jni.h> 8*977Smax.romanov@gmail.com 9*977Smax.romanov@gmail.com #include "nxt_jni_URLClassLoader.h" 10*977Smax.romanov@gmail.com 11*977Smax.romanov@gmail.com 12*977Smax.romanov@gmail.com static jclass nxt_java_URLClassLoader_class; 13*977Smax.romanov@gmail.com static jmethodID nxt_java_URLClassLoader_ctor; 14*977Smax.romanov@gmail.com static jmethodID nxt_java_URLClassLoader_parent_ctor; 15*977Smax.romanov@gmail.com static jmethodID nxt_java_URLClassLoader_loadClass; 16*977Smax.romanov@gmail.com static jmethodID nxt_java_URLClassLoader_addURL; 17*977Smax.romanov@gmail.com 18*977Smax.romanov@gmail.com static jclass nxt_java_URL_class; 19*977Smax.romanov@gmail.com static jmethodID nxt_java_URL_ctor; 20*977Smax.romanov@gmail.com 21*977Smax.romanov@gmail.com 22*977Smax.romanov@gmail.com int 23*977Smax.romanov@gmail.com nxt_java_initURLClassLoader(JNIEnv *env) 24*977Smax.romanov@gmail.com { 25*977Smax.romanov@gmail.com jclass cls; 26*977Smax.romanov@gmail.com 27*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/net/URLClassLoader"); 28*977Smax.romanov@gmail.com if (cls == NULL) { 29*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URLClassLoader not found"); 30*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 31*977Smax.romanov@gmail.com } 32*977Smax.romanov@gmail.com 33*977Smax.romanov@gmail.com nxt_java_URLClassLoader_class = (*env)->NewGlobalRef(env, cls); 34*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 35*977Smax.romanov@gmail.com cls = nxt_java_URLClassLoader_class; 36*977Smax.romanov@gmail.com 37*977Smax.romanov@gmail.com nxt_java_URLClassLoader_ctor = (*env)->GetMethodID(env, cls, 38*977Smax.romanov@gmail.com "<init>", "([Ljava/net/URL;)V"); 39*977Smax.romanov@gmail.com if (nxt_java_URLClassLoader_ctor == NULL) { 40*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URLClassLoader constructor not found"); 41*977Smax.romanov@gmail.com goto failed; 42*977Smax.romanov@gmail.com } 43*977Smax.romanov@gmail.com 44*977Smax.romanov@gmail.com nxt_java_URLClassLoader_parent_ctor = (*env)->GetMethodID(env, cls, 45*977Smax.romanov@gmail.com "<init>", "([Ljava/net/URL;Ljava/lang/ClassLoader;)V"); 46*977Smax.romanov@gmail.com if (nxt_java_URLClassLoader_ctor == NULL) { 47*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URLClassLoader constructor not found"); 48*977Smax.romanov@gmail.com goto failed; 49*977Smax.romanov@gmail.com } 50*977Smax.romanov@gmail.com 51*977Smax.romanov@gmail.com nxt_java_URLClassLoader_loadClass = (*env)->GetMethodID(env, cls, 52*977Smax.romanov@gmail.com "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); 53*977Smax.romanov@gmail.com if (nxt_java_URLClassLoader_loadClass == NULL) { 54*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URLClassLoader.loadClass not found"); 55*977Smax.romanov@gmail.com goto failed; 56*977Smax.romanov@gmail.com } 57*977Smax.romanov@gmail.com 58*977Smax.romanov@gmail.com nxt_java_URLClassLoader_addURL = (*env)->GetMethodID(env, cls, 59*977Smax.romanov@gmail.com "addURL", "(Ljava/net/URL;)V"); 60*977Smax.romanov@gmail.com if (nxt_java_URLClassLoader_addURL == NULL) { 61*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URLClassLoader.addURL not found"); 62*977Smax.romanov@gmail.com goto failed; 63*977Smax.romanov@gmail.com } 64*977Smax.romanov@gmail.com 65*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/net/URL"); 66*977Smax.romanov@gmail.com if (cls == NULL) { 67*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URL not found"); 68*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 69*977Smax.romanov@gmail.com } 70*977Smax.romanov@gmail.com 71*977Smax.romanov@gmail.com nxt_java_URL_class = (*env)->NewGlobalRef(env, cls); 72*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 73*977Smax.romanov@gmail.com cls = nxt_java_URL_class; 74*977Smax.romanov@gmail.com 75*977Smax.romanov@gmail.com nxt_java_URL_ctor = (*env)->GetMethodID(env, cls, 76*977Smax.romanov@gmail.com "<init>", "(Ljava/lang/String;)V"); 77*977Smax.romanov@gmail.com if (nxt_java_URL_ctor == NULL) { 78*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.net.URL constructor not found"); 79*977Smax.romanov@gmail.com goto failed; 80*977Smax.romanov@gmail.com } 81*977Smax.romanov@gmail.com 82*977Smax.romanov@gmail.com return NXT_UNIT_OK; 83*977Smax.romanov@gmail.com 84*977Smax.romanov@gmail.com failed: 85*977Smax.romanov@gmail.com 86*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, cls); 87*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 88*977Smax.romanov@gmail.com } 89*977Smax.romanov@gmail.com 90*977Smax.romanov@gmail.com 91*977Smax.romanov@gmail.com jobject 92*977Smax.romanov@gmail.com nxt_java_newURLClassLoader(JNIEnv *env, int url_count, char **urls) 93*977Smax.romanov@gmail.com { 94*977Smax.romanov@gmail.com jobjectArray jurls; 95*977Smax.romanov@gmail.com 96*977Smax.romanov@gmail.com jurls = nxt_java_newURLs(env, url_count, urls); 97*977Smax.romanov@gmail.com if (jurls == NULL) { 98*977Smax.romanov@gmail.com return NULL; 99*977Smax.romanov@gmail.com } 100*977Smax.romanov@gmail.com 101*977Smax.romanov@gmail.com return (*env)->NewObject(env, nxt_java_URLClassLoader_class, 102*977Smax.romanov@gmail.com nxt_java_URLClassLoader_ctor, jurls); 103*977Smax.romanov@gmail.com } 104*977Smax.romanov@gmail.com 105*977Smax.romanov@gmail.com 106*977Smax.romanov@gmail.com jobject 107*977Smax.romanov@gmail.com nxt_java_newURLClassLoader_parent(JNIEnv *env, int url_count, char **urls, 108*977Smax.romanov@gmail.com jobject parent) 109*977Smax.romanov@gmail.com { 110*977Smax.romanov@gmail.com jobjectArray jurls; 111*977Smax.romanov@gmail.com 112*977Smax.romanov@gmail.com jurls = nxt_java_newURLs(env, url_count, urls); 113*977Smax.romanov@gmail.com if (jurls == NULL) { 114*977Smax.romanov@gmail.com return NULL; 115*977Smax.romanov@gmail.com } 116*977Smax.romanov@gmail.com 117*977Smax.romanov@gmail.com return (*env)->NewObject(env, nxt_java_URLClassLoader_class, 118*977Smax.romanov@gmail.com nxt_java_URLClassLoader_parent_ctor, jurls, 119*977Smax.romanov@gmail.com parent); 120*977Smax.romanov@gmail.com } 121*977Smax.romanov@gmail.com 122*977Smax.romanov@gmail.com 123*977Smax.romanov@gmail.com jobjectArray 124*977Smax.romanov@gmail.com nxt_java_newURLs(JNIEnv *env, int url_count, char **urls) 125*977Smax.romanov@gmail.com { 126*977Smax.romanov@gmail.com int i; 127*977Smax.romanov@gmail.com jstring surl; 128*977Smax.romanov@gmail.com jobject jurl; 129*977Smax.romanov@gmail.com jobjectArray jurls; 130*977Smax.romanov@gmail.com 131*977Smax.romanov@gmail.com jurls = (*env)->NewObjectArray(env, url_count, nxt_java_URL_class, NULL); 132*977Smax.romanov@gmail.com if (jurls == NULL) { 133*977Smax.romanov@gmail.com return NULL; 134*977Smax.romanov@gmail.com } 135*977Smax.romanov@gmail.com 136*977Smax.romanov@gmail.com for (i = 0; i < url_count; i++) { 137*977Smax.romanov@gmail.com surl = (*env)->NewStringUTF(env, urls[i]); 138*977Smax.romanov@gmail.com if (surl == NULL) { 139*977Smax.romanov@gmail.com return NULL; 140*977Smax.romanov@gmail.com } 141*977Smax.romanov@gmail.com 142*977Smax.romanov@gmail.com jurl = (*env)->NewObject(env, nxt_java_URL_class, nxt_java_URL_ctor, 143*977Smax.romanov@gmail.com surl); 144*977Smax.romanov@gmail.com if (jurl == NULL) { 145*977Smax.romanov@gmail.com return NULL; 146*977Smax.romanov@gmail.com } 147*977Smax.romanov@gmail.com 148*977Smax.romanov@gmail.com (*env)->SetObjectArrayElement(env, jurls, i, jurl); 149*977Smax.romanov@gmail.com } 150*977Smax.romanov@gmail.com 151*977Smax.romanov@gmail.com return jurls; 152*977Smax.romanov@gmail.com } 153*977Smax.romanov@gmail.com 154*977Smax.romanov@gmail.com 155*977Smax.romanov@gmail.com jclass 156*977Smax.romanov@gmail.com nxt_java_loadClass(JNIEnv *env, jobject cl, const char *name) 157*977Smax.romanov@gmail.com { 158*977Smax.romanov@gmail.com jstring jname; 159*977Smax.romanov@gmail.com 160*977Smax.romanov@gmail.com jname = (*env)->NewStringUTF(env, name); 161*977Smax.romanov@gmail.com if (jname == NULL) { 162*977Smax.romanov@gmail.com return NULL; 163*977Smax.romanov@gmail.com } 164*977Smax.romanov@gmail.com 165*977Smax.romanov@gmail.com return (*env)->CallObjectMethod(env, cl, nxt_java_URLClassLoader_loadClass, 166*977Smax.romanov@gmail.com jname); 167*977Smax.romanov@gmail.com } 168*977Smax.romanov@gmail.com 169*977Smax.romanov@gmail.com 170*977Smax.romanov@gmail.com void 171*977Smax.romanov@gmail.com nxt_java_addURL(JNIEnv *env, jobject cl, const char *url) 172*977Smax.romanov@gmail.com { 173*977Smax.romanov@gmail.com jstring surl; 174*977Smax.romanov@gmail.com jobject jurl; 175*977Smax.romanov@gmail.com 176*977Smax.romanov@gmail.com surl = (*env)->NewStringUTF(env, url); 177*977Smax.romanov@gmail.com if (surl == NULL) { 178*977Smax.romanov@gmail.com return; 179*977Smax.romanov@gmail.com } 180*977Smax.romanov@gmail.com 181*977Smax.romanov@gmail.com jurl = (*env)->NewObject(env, nxt_java_URL_class, nxt_java_URL_ctor, surl); 182*977Smax.romanov@gmail.com if (jurl == NULL) { 183*977Smax.romanov@gmail.com return; 184*977Smax.romanov@gmail.com } 185*977Smax.romanov@gmail.com 186*977Smax.romanov@gmail.com (*env)->CallVoidMethod(env, cl, nxt_java_URLClassLoader_addURL, jurl); 187*977Smax.romanov@gmail.com } 188