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