All pastes #46222 Raw Edit

Mine

public text v1 · immutable
#46222 ·published 2006-03-19 10:44 UTC
rendered paste body
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, "<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