rendered paste bodyjobject
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, "<init>", "()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