188 lines
4.7 KiB
C
188 lines
4.7 KiB
C
|
|
/*
|
|
* Copyright (C) NGINX, Inc.
|
|
*/
|
|
|
|
#include <nxt_unit.h>
|
|
#include <jni.h>
|
|
|
|
#include "nxt_jni_URLClassLoader.h"
|
|
|
|
|
|
static jclass nxt_java_URLClassLoader_class;
|
|
static jmethodID nxt_java_URLClassLoader_ctor;
|
|
static jmethodID nxt_java_URLClassLoader_parent_ctor;
|
|
static jmethodID nxt_java_URLClassLoader_loadClass;
|
|
static jmethodID nxt_java_URLClassLoader_addURL;
|
|
|
|
static jclass nxt_java_URL_class;
|
|
static jmethodID nxt_java_URL_ctor;
|
|
|
|
|
|
int
|
|
nxt_java_initURLClassLoader(JNIEnv *env)
|
|
{
|
|
jclass cls;
|
|
|
|
cls = (*env)->FindClass(env, "java/net/URLClassLoader");
|
|
if (cls == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URLClassLoader not found");
|
|
return NXT_UNIT_ERROR;
|
|
}
|
|
|
|
nxt_java_URLClassLoader_class = (*env)->NewGlobalRef(env, cls);
|
|
(*env)->DeleteLocalRef(env, cls);
|
|
cls = nxt_java_URLClassLoader_class;
|
|
|
|
nxt_java_URLClassLoader_ctor = (*env)->GetMethodID(env, cls,
|
|
"<init>", "([Ljava/net/URL;)V");
|
|
if (nxt_java_URLClassLoader_ctor == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URLClassLoader constructor not found");
|
|
goto failed;
|
|
}
|
|
|
|
nxt_java_URLClassLoader_parent_ctor = (*env)->GetMethodID(env, cls,
|
|
"<init>", "([Ljava/net/URL;Ljava/lang/ClassLoader;)V");
|
|
if (nxt_java_URLClassLoader_ctor == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URLClassLoader constructor not found");
|
|
goto failed;
|
|
}
|
|
|
|
nxt_java_URLClassLoader_loadClass = (*env)->GetMethodID(env, cls,
|
|
"loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
|
|
if (nxt_java_URLClassLoader_loadClass == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URLClassLoader.loadClass not found");
|
|
goto failed;
|
|
}
|
|
|
|
nxt_java_URLClassLoader_addURL = (*env)->GetMethodID(env, cls,
|
|
"addURL", "(Ljava/net/URL;)V");
|
|
if (nxt_java_URLClassLoader_addURL == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URLClassLoader.addURL not found");
|
|
goto failed;
|
|
}
|
|
|
|
cls = (*env)->FindClass(env, "java/net/URL");
|
|
if (cls == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URL not found");
|
|
return NXT_UNIT_ERROR;
|
|
}
|
|
|
|
nxt_java_URL_class = (*env)->NewGlobalRef(env, cls);
|
|
(*env)->DeleteLocalRef(env, cls);
|
|
cls = nxt_java_URL_class;
|
|
|
|
nxt_java_URL_ctor = (*env)->GetMethodID(env, cls,
|
|
"<init>", "(Ljava/lang/String;)V");
|
|
if (nxt_java_URL_ctor == NULL) {
|
|
nxt_unit_warn(NULL, "java.net.URL constructor not found");
|
|
goto failed;
|
|
}
|
|
|
|
return NXT_UNIT_OK;
|
|
|
|
failed:
|
|
|
|
(*env)->DeleteGlobalRef(env, cls);
|
|
return NXT_UNIT_ERROR;
|
|
}
|
|
|
|
|
|
jobject
|
|
nxt_java_newURLClassLoader(JNIEnv *env, int url_count, char **urls)
|
|
{
|
|
jobjectArray jurls;
|
|
|
|
jurls = nxt_java_newURLs(env, url_count, urls);
|
|
if (jurls == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
return (*env)->NewObject(env, nxt_java_URLClassLoader_class,
|
|
nxt_java_URLClassLoader_ctor, jurls);
|
|
}
|
|
|
|
|
|
jobject
|
|
nxt_java_newURLClassLoader_parent(JNIEnv *env, int url_count, char **urls,
|
|
jobject parent)
|
|
{
|
|
jobjectArray jurls;
|
|
|
|
jurls = nxt_java_newURLs(env, url_count, urls);
|
|
if (jurls == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
return (*env)->NewObject(env, nxt_java_URLClassLoader_class,
|
|
nxt_java_URLClassLoader_parent_ctor, jurls,
|
|
parent);
|
|
}
|
|
|
|
|
|
jobjectArray
|
|
nxt_java_newURLs(JNIEnv *env, int url_count, char **urls)
|
|
{
|
|
int i;
|
|
jstring surl;
|
|
jobject jurl;
|
|
jobjectArray jurls;
|
|
|
|
jurls = (*env)->NewObjectArray(env, url_count, nxt_java_URL_class, NULL);
|
|
if (jurls == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
for (i = 0; i < url_count; i++) {
|
|
surl = (*env)->NewStringUTF(env, urls[i]);
|
|
if (surl == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
jurl = (*env)->NewObject(env, nxt_java_URL_class, nxt_java_URL_ctor,
|
|
surl);
|
|
if (jurl == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
(*env)->SetObjectArrayElement(env, jurls, i, jurl);
|
|
}
|
|
|
|
return jurls;
|
|
}
|
|
|
|
|
|
jclass
|
|
nxt_java_loadClass(JNIEnv *env, jobject cl, const char *name)
|
|
{
|
|
jstring jname;
|
|
|
|
jname = (*env)->NewStringUTF(env, name);
|
|
if (jname == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
return (*env)->CallObjectMethod(env, cl, nxt_java_URLClassLoader_loadClass,
|
|
jname);
|
|
}
|
|
|
|
|
|
void
|
|
nxt_java_addURL(JNIEnv *env, jobject cl, const char *url)
|
|
{
|
|
jstring surl;
|
|
jobject jurl;
|
|
|
|
surl = (*env)->NewStringUTF(env, url);
|
|
if (surl == NULL) {
|
|
return;
|
|
}
|
|
|
|
jurl = (*env)->NewObject(env, nxt_java_URL_class, nxt_java_URL_ctor, surl);
|
|
if (jurl == NULL) {
|
|
return;
|
|
}
|
|
|
|
(*env)->CallVoidMethod(env, cl, nxt_java_URLClassLoader_addURL, jurl);
|
|
}
|