Introducing Java Servlet Container beta.
This commit is contained in:
187
src/java/nxt_jni_URLClassLoader.c
Normal file
187
src/java/nxt_jni_URLClassLoader.c
Normal file
@@ -0,0 +1,187 @@
|
||||
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
Reference in New Issue
Block a user