(SIGAR-201) JNIEnv->ExceptionCheck to avoid possible SEGV on OutOfMemoryError

This commit is contained in:
Doug MacEachern 2010-04-15 10:55:09 -07:00
parent 6c1f0a9871
commit c46af75d74
7 changed files with 103 additions and 15 deletions

View File

@ -249,7 +249,7 @@ int jsigar_list_init(JNIEnv *env, jsigar_list_t *obj)
obj->obj = JENV->NewObject(env, listclass, listid); obj->obj = JENV->NewObject(env, listclass, listid);
obj->id = addid; obj->id = addid;
return SIGAR_OK; return JENV->ExceptionCheck(env) ? !SIGAR_OK : SIGAR_OK;
} }
int jsigar_list_add(void *data, char *value, int len) int jsigar_list_add(void *data, char *value, int len)
@ -260,7 +260,7 @@ int jsigar_list_add(void *data, char *value, int len)
JENV->CallBooleanMethod(env, obj->obj, obj->id, JENV->CallBooleanMethod(env, obj->obj, obj->id,
JENV->NewStringUTF(env, value)); JENV->NewStringUTF(env, value));
return SIGAR_OK; return JENV->ExceptionCheck(env) ? !SIGAR_OK : SIGAR_OK;
} }
JNIEXPORT jstring SIGAR_JNIx(formatSize) JNIEXPORT jstring SIGAR_JNIx(formatSize)
@ -398,9 +398,6 @@ static jstring jnet_address_to_string(JNIEnv *env, sigar_t *sigar, sigar_net_add
#include "javasigar_generated.c" #include "javasigar_generated.c"
#define SIGAR_ALLOC_OBJECT(name) \
JENV->AllocObject(env, SIGAR_FIND_CLASS(name))
enum { enum {
FS_FIELD_DIRNAME, FS_FIELD_DIRNAME,
FS_FIELD_DEVNAME, FS_FIELD_DEVNAME,
@ -448,6 +445,7 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getFileSystemListNative)
JENV->GetFieldID(env, cls, "type", "I"); JENV->GetFieldID(env, cls, "type", "I");
fsarray = JENV->NewObjectArray(env, fslist.number, cls, 0); fsarray = JENV->NewObjectArray(env, fslist.number, cls, 0);
SIGAR_CHEX;
for (i=0; i<fslist.number; i++) { for (i=0; i<fslist.number; i++) {
sigar_file_system_t *fs = &(fslist.data)[i]; sigar_file_system_t *fs = &(fslist.data)[i];
@ -472,6 +470,7 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getFileSystemListNative)
#endif #endif
fsobj = JENV->AllocObject(env, obj_cls); fsobj = JENV->AllocObject(env, obj_cls);
SIGAR_CHEX;
JENV->SetStringField(env, fsobj, JENV->SetStringField(env, fsobj,
ids[FS_FIELD_DIRNAME], ids[FS_FIELD_DIRNAME],
@ -498,6 +497,7 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getFileSystemListNative)
fs->type); fs->type);
JENV->SetObjectArrayElement(env, fsarray, i, fsobj); JENV->SetObjectArrayElement(env, fsarray, i, fsobj);
SIGAR_CHEX;
} }
sigar_file_system_list_destroy(sigar, &fslist); sigar_file_system_list_destroy(sigar, &fslist);
@ -562,12 +562,15 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getCpuInfoList)
JAVA_SIGAR_INIT_FIELDS_CPUINFO(cls); JAVA_SIGAR_INIT_FIELDS_CPUINFO(cls);
cpuarray = JENV->NewObjectArray(env, cpu_infos.number, cls, 0); cpuarray = JENV->NewObjectArray(env, cpu_infos.number, cls, 0);
SIGAR_CHEX;
for (i=0; i<cpu_infos.number; i++) { for (i=0; i<cpu_infos.number; i++) {
jobject info_obj = JENV->AllocObject(env, cls); jobject info_obj = JENV->AllocObject(env, cls);
SIGAR_CHEX;
JAVA_SIGAR_SET_FIELDS_CPUINFO(cls, info_obj, JAVA_SIGAR_SET_FIELDS_CPUINFO(cls, info_obj,
cpu_infos.data[i]); cpu_infos.data[i]);
JENV->SetObjectArrayElement(env, cpuarray, i, info_obj); JENV->SetObjectArrayElement(env, cpuarray, i, info_obj);
SIGAR_CHEX;
} }
sigar_cpu_info_list_destroy(sigar, &cpu_infos); sigar_cpu_info_list_destroy(sigar, &cpu_infos);
@ -593,12 +596,15 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getCpuListNative)
JAVA_SIGAR_INIT_FIELDS_CPU(cls); JAVA_SIGAR_INIT_FIELDS_CPU(cls);
cpuarray = JENV->NewObjectArray(env, cpulist.number, cls, 0); cpuarray = JENV->NewObjectArray(env, cpulist.number, cls, 0);
SIGAR_CHEX;
for (i=0; i<cpulist.number; i++) { for (i=0; i<cpulist.number; i++) {
jobject info_obj = JENV->AllocObject(env, cls); jobject info_obj = JENV->AllocObject(env, cls);
SIGAR_CHEX;
JAVA_SIGAR_SET_FIELDS_CPU(cls, info_obj, JAVA_SIGAR_SET_FIELDS_CPU(cls, info_obj,
cpulist.data[i]); cpulist.data[i]);
JENV->SetObjectArrayElement(env, cpuarray, i, info_obj); JENV->SetObjectArrayElement(env, cpuarray, i, info_obj);
SIGAR_CHEX;
} }
sigar_cpu_list_destroy(sigar, &cpulist); sigar_cpu_list_destroy(sigar, &cpulist);
@ -635,6 +641,7 @@ JNIEXPORT jlongArray SIGAR_JNIx(getProcList)
} }
procarray = JENV->NewLongArray(env, proclist.number); procarray = JENV->NewLongArray(env, proclist.number);
SIGAR_CHEX;
if (sizeof(jlong) == sizeof(sigar_pid_t)) { if (sizeof(jlong) == sizeof(sigar_pid_t)) {
pids = (jlong *)proclist.data; pids = (jlong *)proclist.data;
@ -676,10 +683,12 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getProcArgs)
} }
argsarray = JENV->NewObjectArray(env, procargs.number, stringclass, 0); argsarray = JENV->NewObjectArray(env, procargs.number, stringclass, 0);
SIGAR_CHEX;
for (i=0; i<procargs.number; i++) { for (i=0; i<procargs.number; i++) {
jstring s = JENV->NewStringUTF(env, procargs.data[i]); jstring s = JENV->NewStringUTF(env, procargs.data[i]);
JENV->SetObjectArrayElement(env, argsarray, i, s); JENV->SetObjectArrayElement(env, argsarray, i, s);
SIGAR_CHEX;
} }
sigar_proc_args_destroy(sigar, &procargs); sigar_proc_args_destroy(sigar, &procargs);
@ -704,7 +713,7 @@ static int jni_env_getall(void *data,
JENV->NewStringUTF(env, key), JENV->NewStringUTF(env, key),
JENV->NewStringUTF(env, val)); JENV->NewStringUTF(env, val));
return SIGAR_OK; return JENV->ExceptionCheck(env) ? !SIGAR_OK : SIGAR_OK;
} }
#define MAP_PUT_SIG \ #define MAP_PUT_SIG \
@ -728,6 +737,7 @@ JNIEXPORT jobject SIGAR_JNI(ProcEnv_getAll)
dSIGAR(NULL); dSIGAR(NULL);
hashmap = JENV->NewObject(env, mapclass, mapid); hashmap = JENV->NewObject(env, mapclass, mapid);
SIGAR_CHEX;
put.env = env; put.env = env;
put.id = putid; put.id = putid;
@ -809,7 +819,9 @@ JNIEXPORT jobject SIGAR_JNIx(getProcModulesNative)
dSIGAR(NULL); dSIGAR(NULL);
jsigar_list_init(env, &obj); if (jsigar_list_init(env, &obj) != SIGAR_OK) {
return NULL; /* Exception thrown */
}
procmods.module_getter = jsigar_list_add; procmods.module_getter = jsigar_list_add;
procmods.data = &obj; procmods.data = &obj;
@ -837,6 +849,7 @@ JNIEXPORT jdoubleArray SIGAR_JNIx(getLoadAverage)
} }
avgarray = JENV->NewDoubleArray(env, 3); avgarray = JENV->NewDoubleArray(env, 3);
SIGAR_CHEX;
JENV->SetDoubleArrayRegion(env, avgarray, 0, JENV->SetDoubleArrayRegion(env, avgarray, 0,
3, loadavg.loadavg); 3, loadavg.loadavg);
@ -862,11 +875,14 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getNetRouteList)
JAVA_SIGAR_INIT_FIELDS_NETROUTE(cls); JAVA_SIGAR_INIT_FIELDS_NETROUTE(cls);
routearray = JENV->NewObjectArray(env, routelist.number, cls, 0); routearray = JENV->NewObjectArray(env, routelist.number, cls, 0);
SIGAR_CHEX;
for (i=0; i<routelist.number; i++) { for (i=0; i<routelist.number; i++) {
jobject obj = JENV->AllocObject(env, cls); jobject obj = JENV->AllocObject(env, cls);
SIGAR_CHEX;
JAVA_SIGAR_SET_FIELDS_NETROUTE(cls, obj, routelist.data[i]); JAVA_SIGAR_SET_FIELDS_NETROUTE(cls, obj, routelist.data[i]);
JENV->SetObjectArrayElement(env, routearray, i, obj); JENV->SetObjectArrayElement(env, routearray, i, obj);
SIGAR_CHEX;
} }
sigar_net_route_list_destroy(sigar, &routelist); sigar_net_route_list_destroy(sigar, &routelist);
@ -902,11 +918,14 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getNetConnectionList)
JAVA_SIGAR_INIT_FIELDS_NETCONNECTION(cls); JAVA_SIGAR_INIT_FIELDS_NETCONNECTION(cls);
connarray = JENV->NewObjectArray(env, connlist.number, cls, 0); connarray = JENV->NewObjectArray(env, connlist.number, cls, 0);
SIGAR_CHEX;
for (i=0; i<connlist.number; i++) { for (i=0; i<connlist.number; i++) {
jobject obj = JENV->AllocObject(env, cls); jobject obj = JENV->AllocObject(env, cls);
SIGAR_CHEX;
JAVA_SIGAR_SET_FIELDS_NETCONNECTION(cls, obj, connlist.data[i]); JAVA_SIGAR_SET_FIELDS_NETCONNECTION(cls, obj, connlist.data[i]);
JENV->SetObjectArrayElement(env, connarray, i, obj); JENV->SetObjectArrayElement(env, connarray, i, obj);
SIGAR_CHEX;
} }
sigar_net_connection_list_destroy(sigar, &connlist); sigar_net_connection_list_destroy(sigar, &connlist);
@ -983,6 +1002,10 @@ JNIEXPORT void SIGAR_JNI(NetStat_stat)
} }
states = JENV->NewIntArray(env, SIGAR_TCP_UNKNOWN); states = JENV->NewIntArray(env, SIGAR_TCP_UNKNOWN);
if (JENV->ExceptionCheck(env)) {
return;
}
JENV->SetIntArrayRegion(env, states, 0, JENV->SetIntArrayRegion(env, states, 0,
SIGAR_TCP_UNKNOWN, SIGAR_TCP_UNKNOWN,
tcp_states); tcp_states);
@ -1056,12 +1079,15 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getWhoList)
JAVA_SIGAR_INIT_FIELDS_WHO(cls); JAVA_SIGAR_INIT_FIELDS_WHO(cls);
whoarray = JENV->NewObjectArray(env, wholist.number, cls, 0); whoarray = JENV->NewObjectArray(env, wholist.number, cls, 0);
SIGAR_CHEX;
for (i=0; i<wholist.number; i++) { for (i=0; i<wholist.number; i++) {
jobject info_obj = JENV->AllocObject(env, cls); jobject info_obj = JENV->AllocObject(env, cls);
SIGAR_CHEX;
JAVA_SIGAR_SET_FIELDS_WHO(cls, info_obj, JAVA_SIGAR_SET_FIELDS_WHO(cls, info_obj,
wholist.data[i]); wholist.data[i]);
JENV->SetObjectArrayElement(env, whoarray, i, info_obj); JENV->SetObjectArrayElement(env, whoarray, i, info_obj);
SIGAR_CHEX;
} }
sigar_who_list_destroy(sigar, &wholist); sigar_who_list_destroy(sigar, &wholist);
@ -1158,10 +1184,12 @@ JNIEXPORT jobjectArray SIGAR_JNIx(getNetInterfaceList)
} }
ifarray = JENV->NewObjectArray(env, iflist.number, stringclass, 0); ifarray = JENV->NewObjectArray(env, iflist.number, stringclass, 0);
SIGAR_CHEX;
for (i=0; i<iflist.number; i++) { for (i=0; i<iflist.number; i++) {
jstring s = JENV->NewStringUTF(env, iflist.data[i]); jstring s = JENV->NewStringUTF(env, iflist.data[i]);
JENV->SetObjectArrayElement(env, ifarray, i, s); JENV->SetObjectArrayElement(env, ifarray, i, s);
SIGAR_CHEX;
} }
sigar_net_interface_list_destroy(sigar, &iflist); sigar_net_interface_list_destroy(sigar, &iflist);
@ -1355,6 +1383,7 @@ JNIEXPORT jlongArray SIGAR_JNI(ptql_SigarProcessQuery_find)
} }
procarray = JENV->NewLongArray(env, proclist.number); procarray = JENV->NewLongArray(env, proclist.number);
SIGAR_CHEX;
if (sizeof(jlong) == sizeof(sigar_pid_t)) { if (sizeof(jlong) == sizeof(sigar_pid_t)) {
pids = (jlong *)proclist.data; pids = (jlong *)proclist.data;
@ -1466,7 +1495,7 @@ static int jsigar_getline_completer(char *buffer, int offset, int *pos)
JENV->CallObjectMethod(env, jsigar_completer.obj, JENV->CallObjectMethod(env, jsigar_completer.obj,
jsigar_completer.id, jbuffer); jsigar_completer.id, jbuffer);
if (JENV->ExceptionOccurred(env)) { if (JENV->ExceptionCheck(env)) {
JENV->ExceptionDescribe(env); JENV->ExceptionDescribe(env);
return 0; return 0;
} }
@ -1547,7 +1576,7 @@ static void jsigar_log_impl(sigar_t *sigar, void *data,
log_methods[level], log_methods[level],
"(Ljava/lang/Object;)V"); "(Ljava/lang/Object;)V");
if (JENV->ExceptionOccurred(env)) { if (JENV->ExceptionCheck(env)) {
JENV->ExceptionDescribe(env); JENV->ExceptionDescribe(env);
return; return;
} }

View File

@ -33,6 +33,9 @@
#define SIGAR_CLASS_SIG(name) \ #define SIGAR_CLASS_SIG(name) \
"L" SIGAR_PACKAGE name ";" "L" SIGAR_PACKAGE name ";"
/* CHeck EXception */
#define SIGAR_CHEX if (JENV->ExceptionCheck(env)) return NULL
typedef struct { typedef struct {
JNIEnv *env; JNIEnv *env;
jobject obj; jobject obj;

View File

@ -294,6 +294,7 @@ JNIEXPORT jobject SIGAR_JNI(win32_EventLog_readlog)
} }
obj = JENV->AllocObject(env, cls); obj = JENV->AllocObject(env, cls);
SIGAR_CHEX;
id = JENV->GetFieldID(env, cls, "recordNumber", "J"); id = JENV->GetFieldID(env, cls, "recordNumber", "J");
JENV->SetLongField(env, obj, id, pevlr->RecordNumber); JENV->SetLongField(env, obj, id, pevlr->RecordNumber);
@ -310,9 +311,9 @@ JNIEXPORT jobject SIGAR_JNI(win32_EventLog_readlog)
id = JENV->GetFieldID(env, cls, "eventType", "S"); id = JENV->GetFieldID(env, cls, "eventType", "S");
JENV->SetShortField(env, obj, id, pevlr->EventType); JENV->SetShortField(env, obj, id, pevlr->EventType);
if (!JENV->ExceptionOccurred(env)) { /* careful not to clear any existing exception */ if (!JENV->ExceptionCheck(env)) { /* careful not to clear any existing exception */
id = JENV->GetFieldID(env, cls, "category", "S"); id = JENV->GetFieldID(env, cls, "category", "S");
if (JENV->ExceptionOccurred(env)) { if (JENV->ExceptionCheck(env)) {
/* older version of sigar.jar being used with sigar.dll */ /* older version of sigar.jar being used with sigar.dll */
JENV->ExceptionClear(env); JENV->ExceptionClear(env);
} }

View File

@ -269,6 +269,9 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_MetaBase_MetaBaseGetMultiStringValue)
NewObjectArray(count, NewObjectArray(count,
env->FindClass("java/lang/String"), env->FindClass("java/lang/String"),
env->NewString((const jchar *)"", 1)); env->NewString((const jchar *)"", 1));
if (env->ExceptionCheck()) {
return NULL;
}
// Walk the return instance list, creating an array // Walk the return instance list, creating an array
for (szThisInstance = (TCHAR *)MyRecord.pbMDData, i = 0; for (szThisInstance = (TCHAR *)MyRecord.pbMDData, i = 0;
@ -278,6 +281,9 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_MetaBase_MetaBaseGetMultiStringValue)
env->SetObjectArrayElement(ret,i,env->NewString( env->SetObjectArrayElement(ret,i,env->NewString(
(const jchar *)(LPCTSTR)szThisInstance, (const jchar *)(LPCTSTR)szThisInstance,
lstrlen(szThisInstance))); lstrlen(szThisInstance)));
if (env->ExceptionCheck()) {
return NULL;
}
} }
return ret; return ret;
} }

View File

@ -319,6 +319,10 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetInstances)
JENV->FindClass(env, JENV->FindClass(env,
"java/lang/String"), "java/lang/String"),
JENV->NewStringUTF(env, "")); JENV->NewStringUTF(env, ""));
if (JENV->ExceptionCheck(env)) {
free(instance_list_buf);
return NULL;
}
/* Walk the return instance list, creating an array */ /* Walk the return instance list, creating an array */
for (cur_object = instance_list_buf, i = 0; for (cur_object = instance_list_buf, i = 0;
@ -329,6 +333,10 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetInstances)
jstring s = jstring s =
JENV->NewString(env, (const jchar *)cur_object, len); JENV->NewString(env, (const jchar *)cur_object, len);
JENV->SetObjectArrayElement(env, array, i, s); JENV->SetObjectArrayElement(env, array, i, s);
if (JENV->ExceptionCheck(env)) {
free(instance_list_buf);
return NULL;
}
cur_object += len + 1; cur_object += len + 1;
} }
} else { } else {
@ -391,6 +399,10 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetKeys)
JENV->FindClass(env, JENV->FindClass(env,
"java/lang/String"), "java/lang/String"),
JENV->NewStringUTF(env, "")); JENV->NewStringUTF(env, ""));
if (JENV->ExceptionCheck(env)) {
free(instance_list_buf);
return NULL;
}
/* Walk the return instance list, creating an array */ /* Walk the return instance list, creating an array */
for (cur_object = instance_list_buf, i = 0; for (cur_object = instance_list_buf, i = 0;
@ -401,6 +413,10 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetKeys)
jstring s = jstring s =
JENV->NewString(env, (const jchar *)cur_object, len); JENV->NewString(env, (const jchar *)cur_object, len);
JENV->SetObjectArrayElement(env, array, i, s); JENV->SetObjectArrayElement(env, array, i, s);
if (JENV->ExceptionCheck(env)) {
free(instance_list_buf);
return NULL;
}
cur_object += len + 1; cur_object += len + 1;
} }
} else { } else {
@ -459,6 +475,10 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetObjects)
JENV->FindClass(env, JENV->FindClass(env,
"java/lang/String"), "java/lang/String"),
JENV->NewStringUTF(env, "")); JENV->NewStringUTF(env, ""));
if (JENV->ExceptionCheck(env)) {
free(list_buf);
return NULL;
}
for (cur_object = list_buf, i = 0; for (cur_object = list_buf, i = 0;
*cur_object != 0; *cur_object != 0;
@ -468,6 +488,10 @@ JNIEXPORT jobjectArray SIGAR_JNI(win32_Pdh_pdhGetObjects)
jstring s = jstring s =
JENV->NewString(env, (const jchar *)cur_object, len); JENV->NewString(env, (const jchar *)cur_object, len);
JENV->SetObjectArrayElement(env, array, i, s); JENV->SetObjectArrayElement(env, array, i, s);
if (JENV->ExceptionCheck(env)) {
free(list_buf);
return NULL;
}
cur_object += len + 1; cur_object += len + 1;
} }

View File

@ -331,7 +331,10 @@ JNIEXPORT void SIGAR_JNI(win32_RegistryKey_RegQueryMultiStringValue)
env->NewString((const jchar *)ptr, len); env->NewString((const jchar *)ptr, len);
env->CallBooleanMethod(obj, id, jval); env->CallBooleanMethod(obj, id, jval);
if (env->ExceptionCheck()) {
HeapFree(GetProcessHeap(), 0, value);
return;
}
ptr += len + 1; ptr += len + 1;
} }
} }

View File

@ -289,6 +289,9 @@ static int to_array(JNIEnv *env, LPTSTR str, jobjectArray array)
jstring jstr = jstring jstr =
env->NewString((const jchar *)ptr, slen); env->NewString((const jchar *)ptr, slen);
env->SetObjectArrayElement(array, i, jstr); env->SetObjectArrayElement(array, i, jstr);
if (env->ExceptionCheck()) {
return -1;
}
} }
offset += slen + 1; offset += slen + 1;
ptr = &str[offset]; ptr = &str[offset];
@ -333,11 +336,19 @@ JNIEXPORT jboolean SIGAR_JNI(win32_Service_QueryServiceConfig)
int i; int i;
jobjectArray jargv = jobjectArray jargv =
env->NewObjectArray(argc, stringclass, 0); env->NewObjectArray(argc, stringclass, 0);
if (env->ExceptionCheck()) {
LocalFree(argv);
return JNI_FALSE;
}
for (i=0; i<argc; i++) { for (i=0; i<argc; i++) {
jstring jstr = jstring jstr =
env->NewString((const jchar *)argv[i], lstrlen(argv[i])); env->NewString((const jchar *)argv[i], lstrlen(argv[i]));
env->SetObjectArrayElement(jargv, i, jstr); env->SetObjectArrayElement(jargv, i, jstr);
if (env->ExceptionCheck()) {
LocalFree(argv);
return JNI_FALSE;
}
} }
id = env->GetFieldID(cls, "argv", ASTRING_SIG); id = env->GetFieldID(cls, "argv", ASTRING_SIG);
@ -352,11 +363,22 @@ JNIEXPORT jboolean SIGAR_JNI(win32_Service_QueryServiceConfig)
if (config->lpDependencies) { if (config->lpDependencies) {
/* first pass just get num for NewObjectArray */ /* first pass just get num for NewObjectArray */
jobjectArray dependencies;
int num = to_array(env, config->lpDependencies, NULL); int num = to_array(env, config->lpDependencies, NULL);
jobjectArray dependencies =
env->NewObjectArray(num, stringclass, 0); if (num < 0) {
return JNI_FALSE; /* Exception thrown */
}
dependencies = env->NewObjectArray(num, stringclass, 0);
if (env->ExceptionCheck()) {
return JNI_FALSE;
}
to_array(env, config->lpDependencies, dependencies); to_array(env, config->lpDependencies, dependencies);
if (num < 0) {
return JNI_FALSE; /* Exception thrown */
}
id = env->GetFieldID(cls, "dependencies", ASTRING_SIG); id = env->GetFieldID(cls, "dependencies", ASTRING_SIG);