xref: /unit/src/java/nxt_jni_URLClassLoader.c (revision 977:4f9268f27b57)
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