xref: /unit/src/java/nxt_jni_URLClassLoader.c (revision 977:4f9268f27b57)
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
nxt_java_initURLClassLoader(JNIEnv * env)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
nxt_java_newURLClassLoader(JNIEnv * env,int url_count,char ** urls)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
nxt_java_newURLClassLoader_parent(JNIEnv * env,int url_count,char ** urls,jobject parent)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
nxt_java_newURLs(JNIEnv * env,int url_count,char ** urls)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
nxt_java_loadClass(JNIEnv * env,jobject cl,const char * name)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
nxt_java_addURL(JNIEnv * env,jobject cl,const char * url)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