JNIEXPORT jstring SIGAR_JNI(ProcEnv_getValue) (JNIEnv *env, jobject cls, jobject sigar_obj, jlong pid, jstring key) { int status; sigar_proc_env_t procenv; jni_env_get_t get; dSIGAR(NULL); get.env = env; get.key = JENV->GetStringUTFChars(env, key, 0); get.klen = JENV->GetStringUTFLength(env, key); get.val = NULL; procenv.type = SIGAR_PROC_ENV_KEY; procenv.key = get.key; procenv.klen = get.klen; procenv.env_getter = jni_env_getvalue; procenv.data = &get; if ((status = sigar_proc_env_get(sigar, pid, &procenv)) != SIGAR_OK) { JENV->ReleaseStringUTFChars(env, key, get.key); sigar_throw_error(env, jsigar, status); return NULL; } JENV->ReleaseStringUTFChars(env, key, get.key); return get.val; }
JNIEXPORT jobject SIGAR_JNI(ProcEnv_getAll) (JNIEnv *env, jobject cls, jobject sigar_obj, jlong pid) { int status; sigar_proc_env_t procenv; jobject hashmap; jni_env_put_t put; jclass mapclass = JENV->FindClass(env, "java/util/HashMap"); jmethodID mapid = JENV->GetMethodID(env, mapclass, "<init>", "()V"); jmethodID putid = JENV->GetMethodID(env, mapclass, "put", MAP_PUT_SIG); dSIGAR(NULL); hashmap = JENV->NewObject(env, mapclass, mapid); SIGAR_CHEX; put.env = env; put.id = putid; put.map = hashmap; procenv.type = SIGAR_PROC_ENV_ALL; procenv.env_getter = jni_env_getall; procenv.data = &put; if ((status = sigar_proc_env_get(sigar, pid, &procenv)) != SIGAR_OK) { JENV->DeleteLocalRef(env, hashmap); sigar_throw_error(env, jsigar, status); return NULL; } return hashmap; }
static VALUE rb_sigar_proc_env(VALUE obj, VALUE pid) { int status; sigar_t *sigar = rb_sigar_get(obj); sigar_proc_env_t procenv; VALUE RETVAL = rb_hash_new(); procenv.type = SIGAR_PROC_ENV_ALL; procenv.env_getter = rb_sigar_env_getall; procenv.data = &RETVAL; status = sigar_proc_env_get(sigar, OBJ2PID(pid), &procenv); if (status != SIGAR_OK) { RB_SIGAR_CROAK; } return RETVAL; }