ClassLoader * class_loader_new(JNIEnv *java_env) { ClassLoader *self = g_new0(ClassLoader, 1); self->syslogng_class_loader = CALL_JAVA_FUNCTION(java_env, FindClass, SYSLOG_NG_CLASS_LOADER); if (!self->syslogng_class_loader) { msg_error("Can't find class", evt_tag_str("class_name", SYSLOG_NG_CLASS_LOADER), NULL); goto error; } self->loader_constructor = CALL_JAVA_FUNCTION(java_env, GetMethodID, self->syslogng_class_loader, "<init>", "()V"); if (!self->loader_constructor) { msg_error("Can't find constructor for SyslogNgClassLoader", NULL); goto error; } self->mi_loadclass = CALL_JAVA_FUNCTION(java_env, GetMethodID, self->syslogng_class_loader, "loadClass", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Class;"); if (!self->mi_loadclass) { msg_error("Can't find method in class", evt_tag_str("class_name", SYSLOG_NG_CLASS_LOADER), evt_tag_str("method", "Class loadClass(String className)"), NULL); goto error; } self->mi_init_current_thread = CALL_JAVA_FUNCTION(java_env, GetMethodID, self->syslogng_class_loader, "initCurrentThread", "()V"); if (!self->mi_init_current_thread) { msg_error("Can't find method in class", evt_tag_str("class_name", SYSLOG_NG_CLASS_LOADER), evt_tag_str("method", "void initCurrentThread()"), NULL); } self->loader_object = CALL_JAVA_FUNCTION(java_env, NewObject, self->syslogng_class_loader, self->loader_constructor); if (!self->loader_object) { msg_error("Can't create SyslogNgClassLoader", NULL); goto error; } return self; error: class_loader_free(self, java_env); return NULL; }
jclass class_loader_load_class(ClassLoader *self, JNIEnv *java_env, const gchar *class_name, const gchar *class_path) { jclass result; jstring str_class_name = CALL_JAVA_FUNCTION(java_env, NewStringUTF, class_name); jstring str_class_path = __create_class_path(self, java_env, class_path); result = CALL_JAVA_FUNCTION(java_env, CallObjectMethod, self->loader_object, self->mi_loadclass, str_class_name, str_class_path); CALL_JAVA_FUNCTION(java_env, DeleteLocalRef, str_class_name); CALL_JAVA_FUNCTION(java_env, DeleteLocalRef, str_class_path); return result; }
void class_loader_free(ClassLoader *self, JNIEnv *java_env) { if (!self) { return; } if (self->loader_object) { CALL_JAVA_FUNCTION(java_env, DeleteLocalRef, self->loader_object); } if (self->syslogng_class_loader) { CALL_JAVA_FUNCTION(java_env, DeleteLocalRef, self->syslogng_class_loader); } g_free(self); return; }
jobject java_log_message_proxy_create_java_object(JavaLogMessageProxy *self, LogMessage *msg) { JNIEnv *java_env = java_machine_get_env(self->java_machine, &java_env); jobject jmsg = CALL_JAVA_FUNCTION(java_env, NewObject, self->loaded_class, self->mi_constructor, log_msg_ref(msg)); if (!jmsg) { msg_error("Can't create object", evt_tag_str("class_name", LOG_MESSAGE), NULL); } return jmsg; }
void java_log_message_proxy_free(JavaLogMessageProxy *self) { JNIEnv *env = NULL; env = java_machine_get_env(self->java_machine, &env); if (self->loaded_class) { CALL_JAVA_FUNCTION(env, DeleteLocalRef, self->loaded_class); } java_machine_unref(self->java_machine); g_free(self); }
jstring __create_class_path(ClassLoader *self, JNIEnv *java_env, const gchar *class_path) { GString *g_class_path = g_string_new(get_installation_path_for(SYSLOG_NG_JAVA_MODULE_PATH)); jstring str_class_path = NULL; g_string_append(g_class_path, "/" SYSLOG_NG_JAR); if (class_path && (strlen(class_path) > 0)) { g_string_append_c(g_class_path, ':'); g_string_append(g_class_path, class_path); } str_class_path = CALL_JAVA_FUNCTION(java_env, NewStringUTF, g_class_path->str); g_string_free(g_class_path, TRUE); return str_class_path; }
static gboolean __load_object(JavaLogMessageProxy *self) { JNIEnv *java_env = NULL; java_env = java_machine_get_env(self->java_machine, &java_env); self->loaded_class = java_machine_load_class(self->java_machine, LOG_MESSAGE, NULL); if (!self->loaded_class) { msg_error("Can't find class", evt_tag_str("class_name", LOG_MESSAGE), NULL); return FALSE; } self->mi_constructor = CALL_JAVA_FUNCTION(java_env, GetMethodID, self->loaded_class, "<init>", "(J)V"); if (!self->mi_constructor) { msg_error("Can't find default constructor for class", evt_tag_str("class_name", LOG_MESSAGE), NULL); return FALSE; } return TRUE; }
void class_loader_init_current_thread(ClassLoader *self, JNIEnv *java_env) { CALL_JAVA_FUNCTION(java_env, CallVoidMethod, self->loader_object, self->mi_init_current_thread); }