It's a good job I compile with -Werror; the new gtkpeer.c file only supports 32-bit pointers, thus squashing 64-bit ones into a 32-bit integer. This adds #ifdefs in the same style as jcl.h
2007-05-08 Andrew John Hughes <[EMAIL PROTECTED]>
* native/jni/gtk-peer/gtkpeer.c:
Added support for 64-bit architectures.
--
Andrew :-)
Escape the Java Trap with GNU Classpath!
http://www.gnu.org/philosophy/java-trap.html
public class gcj extends Freedom implements Java { ... }
Index: native/jni/gtk-peer/gtkpeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.c,v
retrieving revision 1.1
diff -u -3 -p -u -r1.1 gtkpeer.c
--- native/jni/gtk-peer/gtkpeer.c 25 Apr 2007 14:53:04 -0000 1.1
+++ native/jni/gtk-peer/gtkpeer.c 7 May 2007 23:52:52 -0000
@@ -39,17 +39,17 @@ exception statement from your version. *
#include "jni.h"
/**
- * The Pointer32 class.
+ * The Pointer class.
*/
static jclass pointerClass;
/**
- * The Pointer32 constructor.
+ * The Pointer constructor.
*/
static jmethodID pointerConstructorMID;
/**
- * The field ID of the data field in the Pointer32 class.
+ * The field ID of the data field in the Pointer class.
*/
static jfieldID pointerDataFID;
@@ -90,12 +90,27 @@ static jfieldID pixbufLoaderFID;
*/
void gtkpeer_init_pointer_IDs(JNIEnv* env)
{
+#if SIZEOF_VOID_P == 8
+ pointerClass = (*env)->FindClass (env, "gnu/classpath/Pointer64");
+ if (pointerClass != NULL)
+ {
+ pointerClass = (*env)->NewGlobalRef (env, pointerClass);
+ pointerDataFID = (*env)->GetFieldID (env, pointerClass, "data", "J");
+ pointerConstructorMID = (*env)->GetMethodID (env, pointerClass, "<init>",
+ "(J)V");
+ }
+#else
+#if SIZEOF_VOID_P == 4
pointerClass = (*env)->FindClass(env, "gnu/classpath/Pointer32");
pointerDataFID = (*env)->GetFieldID(env, pointerClass, "data", "I");
/* Find the Pointer32 constructor. */
pointerConstructorMID = (*env)->GetMethodID(env, pointerClass, "<init>",
"(I)V");
+#else
+#error "Pointer size is not supported."
+#endif /* SIZEOF_VOID_P == 4 */
+#endif /* SIZEOF_VOID_P == 8 */
}
/**
@@ -133,13 +148,22 @@ void gtkpeer_set_widget(JNIEnv *env, job
if (obj == NULL)
{
/* Create if necessary. */
+#if SIZEOF_VOID_P == 8
+ obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
+ (jlong) widget);
+#else
obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
(jint) widget);
+#endif
(*env)->SetObjectField(env, peer, widgetFID, obj);
}
else
{
+#if SIZEOF_VOID_P == 8
+ (*env)->SetLongField(env, obj, pointerDataFID, (jlong) widget);
+#else
(*env)->SetIntField(env, obj, pointerDataFID, (jint) widget);
+#endif
}
}
@@ -160,7 +184,11 @@ void* gtkpeer_get_widget(JNIEnv *env, jo
obj = (*env)->GetObjectField(env, peer, widgetFID);
/* Fetch actual widget pointer. */
+#if SIZEOF_VOID_P == 8
+ widget = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
widget = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
return widget;
}
@@ -184,13 +212,22 @@ void gtkpeer_set_global_ref(JNIEnv *env,
if (obj == NULL)
{
/* Create if necessary. */
+#if SIZEOF_VOID_P == 8
+ obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
+ (jlong) globalRef);
+#else
obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
(jint) globalRef);
+#endif
(*env)->SetObjectField(env, peer, globalRefFID, obj);
}
else
{
+#if SIZEOF_VOID_P == 8
+ (*env)->SetLongField(env, obj, pointerDataFID, (jlong) globalRef);
+#else
(*env)->SetIntField(env, obj, pointerDataFID, (jint) globalRef);
+#endif
}
}
@@ -211,7 +248,11 @@ void* gtkpeer_get_global_ref(JNIEnv *env
obj = (*env)->GetObjectField(env, peer, globalRefFID);
/* Fetch actual globalRef pointer. */
+#if SIZEOF_VOID_P == 8
+ globalRef = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
globalRef = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
return globalRef;
}
@@ -231,7 +272,11 @@ void gtkpeer_del_global_ref(JNIEnv* env,
obj = (*env)->GetObjectField(env, peer, globalRefFID);
/* Fetch actual globalRef pointer. */
+#if SIZEOF_VOID_P == 8
+ globalRef = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
globalRef = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
(*env)->DeleteGlobalRef(env, globalRef);
}
@@ -266,13 +311,22 @@ void gtkpeer_set_display(JNIEnv* env, jo
if (obj == NULL)
{
/* Create if necessary. */
+#if SIZEOF_VOID_P == 8
+ obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
+ (jlong) display);
+#else
obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
(jint) display);
+#endif
(*env)->SetObjectField(env, graphicsenv, displayFID, obj);
}
else
{
+#if SIZEOF_VOID_P == 8
+ (*env)->SetLongField(env, obj, pointerDataFID, (jlong) display);
+#else
(*env)->SetIntField(env, obj, pointerDataFID, (jint) display);
+#endif
}
}
@@ -293,7 +347,11 @@ void* gtkpeer_get_display(JNIEnv* env, j
obj = (*env)->GetObjectField(env, graphicsenv, displayFID);
/* Fetch actual display pointer. */
+#if SIZEOF_VOID_P == 8
+ display = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
display = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
return display;
}
@@ -330,13 +388,22 @@ void gtkpeer_set_screen(JNIEnv* env, job
if (obj == NULL)
{
/* Create if necessary. */
+#if SIZEOF_VOID_P == 8
+ obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
+ (jlong) ptr);
+#else
obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
(jint) ptr);
+#endif
(*env)->SetObjectField(env, screen_graphics_device, screenFID, obj);
}
else
{
+#if SIZEOF_VOID_P == 8
+ (*env)->SetLongField(env, obj, pointerDataFID, (jlong) ptr);
+#else
(*env)->SetIntField(env, obj, pointerDataFID, (jint) ptr);
+#endif
}
}
@@ -357,7 +424,11 @@ void* gtkpeer_get_screen(JNIEnv* env, jo
obj = (*env)->GetObjectField(env, screen_graphics_device, screenFID);
/* Fetch actual display pointer. */
+#if SIZEOF_VOID_P == 8
+ screen = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
screen = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
return screen;
}
@@ -392,13 +463,22 @@ void gtkpeer_set_font(JNIEnv* env, jobje
if (obj == NULL)
{
/* Create if necessary. */
+#if SIZEOF_VOID_P == 8
+ obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
+ (jlong) font);
+#else
obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
(jint) font);
+#endif
(*env)->SetObjectField(env, font_peer, fontFID, obj);
}
else
{
+#if SIZEOF_VOID_P == 8
+ (*env)->SetLongField(env, obj, pointerDataFID, (jlong) font);
+#else
(*env)->SetIntField(env, obj, pointerDataFID, (jint) font);
+#endif
}
}
@@ -419,7 +499,11 @@ void* gtkpeer_get_font(JNIEnv* env, jobj
obj = (*env)->GetObjectField(env, font_peer, fontFID);
/* Fetch actual font pointer. */
+#if SIZEOF_VOID_P == 8
+ font = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
font = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
return font;
}
@@ -455,13 +539,22 @@ void gtkpeer_set_pixbuf_loader(JNIEnv* e
if (obj == NULL)
{
/* Create if necessary. */
+#if SIZEOF_VOID_P == 8
+ obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
+ (jlong) pixbuf_loader);
+#else
obj = (*env)->NewObject(env, pointerClass, pointerConstructorMID,
(jint) pixbuf_loader);
+#endif
(*env)->SetObjectField(env, pixbuf_dec, pixbufLoaderFID, obj);
}
else
{
+#if SIZEOF_VOID_P == 8
+ (*env)->SetLongField(env, obj, pointerDataFID, (jlong) pixbuf_loader);
+#else
(*env)->SetIntField(env, obj, pointerDataFID, (jint) pixbuf_loader);
+#endif
}
}
@@ -482,6 +575,10 @@ void* gtkpeer_get_pixbuf_loader(JNIEnv*
obj = (*env)->GetObjectField(env, pixbuf_dec, pixbufLoaderFID);
/* Fetch actual font pointer. */
+#if SIZEOF_VOID_P == 8
+ loader = (void*) (*env)->GetLongField(env, obj, pointerDataFID);
+#else
loader = (void*) (*env)->GetIntField(env, obj, pointerDataFID);
+#endif
return loader;
}
signature.asc
Description: Digital signature
