jobject getHandleFromPointer (JNIEnv* env, void* pointer) { static jmethodID constructor = NULL; jobject handle; jclass handleClass = getHandleClass(env); if (handleClass == NULL) return NULL; jfieldID pointerField = getPointerField (env); if (pointerField == NULL) return NULL; if (constructor == NULL) { constructor = (*env)->GetMethodID(env, handleClass, "", "()V"); if (constructor == NULL) return NULL; } // I called GetSuperclass here and it died too handle = (*env)->NewObject(env, handleClass, constructor); (*env)->SET_POINTER_FIELD(env, handle, pointerField, (JPOINTER) pointer); return handle; } -------------------------------------------- typedef struct{ JNIEnv *env; jobject obj; jmethodID mid; } ForEachData; static void forEachFunc(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { jvalue *jargs; ForEachData *fedata = (ForEachData *) data; JNIEnv* env = fedata->env; jargs = malloc(sizeof(jvalue) * 3); if (env == NULL) { g_print("Null\n"); } else { g_print("Nope\n"); } g_print("getting model\n"); jargs[0].l = getGObjectHandleAndRef(env, (GObject *) model); if (jargs[0].l == NULL) { g_print("model is null\n"); } else { g_print("model is okay\n"); } if (env == NULL) { g_print("Null\n"); } else { g_print("Nope\n"); } g_print("getting path\n"); jargs[1].l = getGBoxedHandle(env, path, GTK_TYPE_TREE_PATH, (GBoxedCopyFunc) gtk_tree_path_copy, (GBoxedFreeFunc) gtk_tree_path_free); g_print("getting iter\n"); jargs[2].l = getGBoxedHandle(env, iter, GTK_TYPE_TREE_ITER, (GBoxedCopyFunc) gtk_tree_iter_copy, (GBoxedFreeFunc) gtk_tree_iter_free); (*(fedata->env))->CallVoidMethodA(fedata->env, fedata->obj, fedata->mid, jargs); g_free(jargs); //(*env)->DeleteGlobalRef(fedata->env, fedata->obj); g_free(fedata); } JNIEXPORT void JNICALL Java_org_gnu_gtk_TreeSelection_startForEach (JNIEnv *env, jclass cls, jobject selection, jobject connect_to) { ForEachData * fedata = g_new(ForEachData, 1); GtkTreeSelection *selection_g = (GtkTreeSelection *)getPointerFromHandle(env, selection); fedata->env = env; fedata->obj = (*env)->NewGlobalRef(env, connect_to); fedata->mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, connect_to), "doEach", "(Lorg/gnu/glib/Handle;Lorg/gnu/glib/Handle;Lorg/gnu/glib/Handle;)V"); gtk_tree_selection_selected_foreach(selection_g, (GtkTreeSelectionForeachFunc) forEachFunc, fedata); } -------------------------------- Console output: (the number 0 is from my Java sysout) Nope getting model model is okay Nope getting path getting iter 0 Nope getting model model is okay Nope getting path getting iter 0 Null getting model model is okay Null getting path