예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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);
}
예제 #6
0
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;
}
예제 #7
0
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;
}
예제 #8
0
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);
}