X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fjava.c;h=903b4a5bbce938e40d32a23cd6de6b8627e99467;hb=50ce9cb167a467ae1dff145702eb4a95fb506008;hp=243e8f1e8a4c0801ec3c365942474ba1539a2af0;hpb=5e44402e816ffa5087a3ec310b78494d06fe4900;p=collectd.git diff --git a/src/java.c b/src/java.c index 243e8f1e..903b4a5b 100644 --- a/src/java.c +++ b/src/java.c @@ -288,7 +288,7 @@ static jobject ctoj_value_to_number (JNIEnv *jvm_env, /* {{{ */ return (NULL); } /* }}} jobject ctoj_value_to_number */ -/* Convert a data_source_t to a org.collectd.api.DataSource */ +/* Convert a data_source_t to a org/collectd/api/DataSource */ static jobject ctoj_data_source (JNIEnv *jvm_env, /* {{{ */ const data_source_t *dsrc) { @@ -299,11 +299,11 @@ static jobject ctoj_data_source (JNIEnv *jvm_env, /* {{{ */ /* Look up the DataSource class */ c_datasource = (*jvm_env)->FindClass (jvm_env, - "org.collectd.api.DataSource"); + "org/collectd/api/DataSource"); if (c_datasource == NULL) { ERROR ("java plugin: ctoj_data_source: " - "FindClass (org.collectd.api.DataSource) failed."); + "FindClass (org/collectd/api/DataSource) failed."); return (NULL); } @@ -374,7 +374,7 @@ static jobject ctoj_data_source (JNIEnv *jvm_env, /* {{{ */ return (o_datasource); } /* }}} jobject ctoj_data_source */ -/* Convert a oconfig_value_t to a org.collectd.api.OConfigValue */ +/* Convert a oconfig_value_t to a org/collectd/api/OConfigValue */ static jobject ctoj_oconfig_value (JNIEnv *jvm_env, /* {{{ */ oconfig_value_t ocvalue) { @@ -387,11 +387,11 @@ static jobject ctoj_oconfig_value (JNIEnv *jvm_env, /* {{{ */ o_argument = NULL; c_ocvalue = (*jvm_env)->FindClass (jvm_env, - "org.collectd.api.OConfigValue"); + "org/collectd/api/OConfigValue"); if (c_ocvalue == NULL) { ERROR ("java plugin: ctoj_oconfig_value: " - "FindClass (org.collectd.api.OConfigValue) failed."); + "FindClass (org/collectd/api/OConfigValue) failed."); return (NULL); } @@ -474,7 +474,7 @@ static jobject ctoj_oconfig_value (JNIEnv *jvm_env, /* {{{ */ return (o_ocvalue); } /* }}} jobject ctoj_oconfig_value */ -/* Convert a oconfig_item_t to a org.collectd.api.OConfigItem */ +/* Convert a oconfig_item_t to a org/collectd/api/OConfigItem */ static jobject ctoj_oconfig_item (JNIEnv *jvm_env, /* {{{ */ const oconfig_item_t *ci) { @@ -486,11 +486,11 @@ static jobject ctoj_oconfig_item (JNIEnv *jvm_env, /* {{{ */ jobject o_ocitem; int i; - c_ocitem = (*jvm_env)->FindClass (jvm_env, "org.collectd.api.OConfigItem"); + c_ocitem = (*jvm_env)->FindClass (jvm_env, "org/collectd/api/OConfigItem"); if (c_ocitem == NULL) { ERROR ("java plugin: ctoj_oconfig_item: " - "FindClass (org.collectd.api.OConfigItem) failed."); + "FindClass (org/collectd/api/OConfigItem) failed."); return (NULL); } @@ -580,14 +580,14 @@ static jobject ctoj_oconfig_item (JNIEnv *jvm_env, /* {{{ */ return (NULL); } - (*jvm_env)->CallVoidMethod (jvm_env, o_ocitem, m_addvalue, o_child); + (*jvm_env)->CallVoidMethod (jvm_env, o_ocitem, m_addchild, o_child); (*jvm_env)->DeleteLocalRef (jvm_env, o_child); } /* }}} for (i = 0; i < ci->children_num; i++) */ return (o_ocitem); } /* }}} jobject ctoj_oconfig_item */ -/* Convert a data_set_t to a org.collectd.api.DataSet */ +/* Convert a data_set_t to a org/collectd/api/DataSet */ static jobject ctoj_data_set (JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */ { jclass c_dataset; @@ -597,12 +597,12 @@ static jobject ctoj_data_set (JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */ jobject o_dataset; int i; - /* Look up the org.collectd.api.DataSet class */ - c_dataset = (*jvm_env)->FindClass (jvm_env, "org.collectd.api.DataSet"); + /* Look up the org/collectd/api/DataSet class */ + c_dataset = (*jvm_env)->FindClass (jvm_env, "org/collectd/api/DataSet"); if (c_dataset == NULL) { ERROR ("java plugin: ctoj_data_set: Looking up the " - "org.collectd.api.DataSet class failed."); + "org/collectd/api/DataSet class failed."); return (NULL); } @@ -618,7 +618,7 @@ static jobject ctoj_data_set (JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */ /* Search for the `void addDataSource (DataSource)' method. */ m_add = (*jvm_env)->GetMethodID (jvm_env, - c_dataset, "addDataSource", "(Lorg.collectd.api.DataSource;)V"); + c_dataset, "addDataSource", "(Lorg/collectd/api/DataSource;)V"); if (m_add == NULL) { ERROR ("java plugin: ctoj_data_set: Looking up the " @@ -705,7 +705,7 @@ static int ctoj_value_list_add_data_set (JNIEnv *jvm_env, /* {{{ */ /* Look for the `void setDataSource (List ds)' method. */ m_setdataset = (*jvm_env)->GetMethodID (jvm_env, c_valuelist, - "setDataSet", "(Lorg.collectd.api.DataSet;)V"); + "setDataSet", "(Lorg/collectd/api/DataSet;)V"); if (m_setdataset == NULL) { ERROR ("java plugin: ctoj_value_list_add_data_set: " @@ -732,7 +732,7 @@ static int ctoj_value_list_add_data_set (JNIEnv *jvm_env, /* {{{ */ return (0); } /* }}} int ctoj_value_list_add_data_set */ -/* Convert a value_list_t (and data_set_t) to a org.collectd.api.ValueList */ +/* Convert a value_list_t (and data_set_t) to a org/collectd/api/ValueList */ static jobject ctoj_value_list (JNIEnv *jvm_env, /* {{{ */ const data_set_t *ds, const value_list_t *vl) { @@ -745,11 +745,11 @@ static jobject ctoj_value_list (JNIEnv *jvm_env, /* {{{ */ /* First, create a new ValueList instance.. * Look up the class.. */ c_valuelist = (*jvm_env)->FindClass (jvm_env, - "org.collectd.api.ValueList"); + "org/collectd/api/ValueList"); if (c_valuelist == NULL) { ERROR ("java plugin: ctoj_value_list: " - "FindClass (org.collectd.api.ValueList) failed."); + "FindClass (org/collectd/api/ValueList) failed."); return (NULL); } @@ -838,7 +838,7 @@ static jobject ctoj_value_list (JNIEnv *jvm_env, /* {{{ */ return (o_valuelist); } /* }}} jobject ctoj_value_list */ -/* Convert a notification_t to a org.collectd.api.Notification */ +/* Convert a notification_t to a org/collectd/api/Notification */ static jobject ctoj_notification (JNIEnv *jvm_env, /* {{{ */ const notification_t *n) { @@ -850,11 +850,11 @@ static jobject ctoj_notification (JNIEnv *jvm_env, /* {{{ */ /* First, create a new Notification instance.. * Look up the class.. */ c_notification = (*jvm_env)->FindClass (jvm_env, - "org.collectd.api.Notification"); + "org/collectd/api/Notification"); if (c_notification == NULL) { ERROR ("java plugin: ctoj_notification: " - "FindClass (org.collectd.api.Notification) failed."); + "FindClass (org/collectd/api/Notification) failed."); return (NULL); } @@ -1179,7 +1179,7 @@ static int jtoc_values_array (JNIEnv *jvm_env, /* {{{ */ return (0); } /* }}} int jtoc_values_array */ -/* Convert a org.collectd.api.ValueList to a value_list_t. */ +/* Convert a org/collectd/api/ValueList to a value_list_t. */ static int jtoc_value_list (JNIEnv *jvm_env, value_list_t *vl, /* {{{ */ jobject object_ptr) { @@ -1251,7 +1251,7 @@ static int jtoc_value_list (JNIEnv *jvm_env, value_list_t *vl, /* {{{ */ return (0); } /* }}} int jtoc_value_list */ -/* Convert a org.collectd.api.Notification to a notification_t. */ +/* Convert a org/collectd/api/Notification to a notification_t. */ static int jtoc_notification (JNIEnv *jvm_env, notification_t *n, /* {{{ */ jobject object_ptr) { @@ -1782,7 +1782,15 @@ static cjni_callback_info_t *cjni_callback_info_create (JNIEnv *jvm_env, /* {{{ (*jvm_env)->ReleaseStringUTFChars (jvm_env, o_name, c_name); - cbi->class = (*jvm_env)->GetObjectClass (jvm_env, o_callback); + cbi->object = (*jvm_env)->NewGlobalRef (jvm_env, o_callback); + if (cbi->object == NULL) + { + ERROR ("java plugin: cjni_callback_info_create: NewGlobalRef failed."); + free (cbi); + return (NULL); + } + + cbi->class = (*jvm_env)->GetObjectClass (jvm_env, cbi->object); if (cbi->class == NULL) { ERROR ("java plugin: cjni_callback_info_create: GetObjectClass failed."); @@ -1790,8 +1798,6 @@ static cjni_callback_info_t *cjni_callback_info_create (JNIEnv *jvm_env, /* {{{ return (NULL); } - cbi->object = o_callback; - cbi->method = (*jvm_env)->GetMethodID (jvm_env, cbi->class, method_name, method_signature); if (cbi->method == NULL) @@ -1803,8 +1809,6 @@ static cjni_callback_info_t *cjni_callback_info_create (JNIEnv *jvm_env, /* {{{ return (NULL); } - (*jvm_env)->NewGlobalRef (jvm_env, o_callback); - return (cbi); } /* }}} cjni_callback_info_t cjni_callback_info_create */ @@ -1912,10 +1916,10 @@ static int cjni_init_native (JNIEnv *jvm_env) /* {{{ */ jclass api_class_ptr; int status; - api_class_ptr = (*jvm_env)->FindClass (jvm_env, "org.collectd.api.Collectd"); + api_class_ptr = (*jvm_env)->FindClass (jvm_env, "org/collectd/api/Collectd"); if (api_class_ptr == NULL) { - ERROR ("cjni_init_native: Cannot find API class `org.collectd.api.Collectd'."); + ERROR ("cjni_init_native: Cannot find API class `org/collectd/api/Collectd'."); return (-1); } @@ -1965,10 +1969,6 @@ static int cjni_create_jvm (void) /* {{{ */ i, jvm_argv[i]); vm_args.options[i].optionString = jvm_argv[i]; } - /* - vm_args.options[0].optionString = "-verbose:jni"; - vm_args.options[1].optionString = "-Djava.class.path=/home/octo/collectd/bindings/java"; - */ status = JNI_CreateJavaVM (&jvm, (void **) &jvm_env, (void **) &vm_args); if (status != 0) @@ -2145,6 +2145,7 @@ static int cjni_config_load_plugin (oconfig_item_t *ci) /* {{{ */ JNIEnv *jvm_env; java_plugin_class_t *class; jmethodID constructor_id; + jobject tmp_object; if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { @@ -2202,8 +2203,12 @@ static int cjni_config_load_plugin (oconfig_item_t *ci) /* {{{ */ return (-1); } - class->object = (*jvm_env)->NewObject (jvm_env, class->class, + tmp_object = (*jvm_env)->NewObject (jvm_env, class->class, constructor_id); + if (tmp_object != NULL) + class->object = (*jvm_env)->NewGlobalRef (jvm_env, tmp_object); + else + class->object = NULL; if (class->object == NULL) { ERROR ("java plugin: cjni_config_load_plugin: " @@ -2214,7 +2219,6 @@ static int cjni_config_load_plugin (oconfig_item_t *ci) /* {{{ */ return (-1); } - (*jvm_env)->NewGlobalRef (jvm_env, class->object); cjni_thread_detach (); java_classes_list_len++; @@ -2231,6 +2235,9 @@ static int cjni_config_plugin_block (oconfig_item_t *ci) /* {{{ */ int status; size_t i; + jclass class; + jmethodID method; + if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING ("java plugin: `Plugin' blocks " @@ -2276,8 +2283,12 @@ static int cjni_config_plugin_block (oconfig_item_t *ci) /* {{{ */ return (-1); } + class = (*jvm_env)->GetObjectClass (jvm_env, cbi->object); + method = (*jvm_env)->GetMethodID (jvm_env, class, + "config", "(Lorg/collectd/api/OConfigItem;)I"); + status = (*jvm_env)->CallIntMethod (jvm_env, - cbi->object, cbi->method, o_ocitem); + cbi->object, method, o_ocitem); (*jvm_env)->DeleteLocalRef (jvm_env, o_ocitem); cjni_thread_detach (); @@ -2615,6 +2626,7 @@ static int cjni_match_target_create (const oconfig_item_t *ci, /* {{{ */ cjni_callback_info_t *cbi_factory; const char *name; jobject o_ci; + jobject o_tmp; int type; size_t i; @@ -2716,14 +2728,21 @@ static int cjni_match_target_create (const oconfig_item_t *ci, /* {{{ */ } /* Then call the factory method so it creates a new object for us. */ - cbi_ret->object = (*jvm_env)->CallObjectMethod (jvm_env, + o_tmp = (*jvm_env)->CallObjectMethod (jvm_env, cbi_factory->object, cbi_factory->method, o_ci); - if (cbi_ret->object == NULL) + if (o_tmp == NULL) { ERROR ("java plugin: cjni_match_target_create: CallObjectMethod failed."); BAIL_OUT (-1); } + cbi_ret->object = (*jvm_env)->NewGlobalRef (jvm_env, o_tmp); + if (o_tmp == NULL) + { + ERROR ("java plugin: cjni_match_target_create: NewGlobalRef failed."); + BAIL_OUT (-1); + } + /* This is the class of the match. It is possibly different from the class of * the match-factory! */ cbi_ret->class = (*jvm_env)->GetObjectClass (jvm_env, cbi_ret->object); @@ -2743,10 +2762,6 @@ static int cjni_match_target_create (const oconfig_item_t *ci, /* {{{ */ BAIL_OUT (-1); } - /* We have everything we hoped for. Now we add a new global reference so this - * match isn't freed immediately after we return.. */ - (*jvm_env)->NewGlobalRef (jvm_env, cbi_ret->object); - /* Return the newly created match via the user_data pointer. */ *user_data = (void *) cbi_ret;