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