Hi Andrew,

On Tue, 2008-08-26 at 00:46 +0100, Andrew John Hughes wrote:
> >  I'm currently stuck on this strange issue whereby
> >  sun_java2d_opengl_OGLContext_OGLContextCaps.h is not being generated.
> >  Has anyone else seen this? To try for yourself, you can get a b33
> >  IcedTea from http://fuseyism.com/hg/icedtea.
>
> Further on this, with Mark's help via IRC, I made the following
> additions to icedtea-ecj.patch:
> 
> +++ openjdk-ecj/jdk/make/common/Rules.gmk     2008-08-26 00:30:58.000000000 
> +0100
> 
> - +-          $(CLASSES.export) $(subst $$,\$$,$(EXPORTED_inner))
> +             $(CLASSES.export)
> +     $(foreach innerclass,$(subst $$,\$$,$(EXPORTED_inner)), \
> +       $(JAVAH_CMD) \
> +         -o $(CLASSHDRDIR)/$(subst .,_,$(subst \$$,_,$(innerclass))).h \
> +         $(innerclass))
>
> +++ openjdk-ecj/jdk/make/sun/awt/FILES_export_unix.gmk        2008-08-25
> 3:13:37.000000000 +0100
> @@ -223,3 +223,5 @@
>       sun/awt/CausedFocusEvent.java \
>       sun/awt/motif/MEmbedCanvasPeer.java
> 
> +EXPORTED_inner = \
> +    sun.java2d.opengl.OGLContext$$OGLContextCaps
> 
> The first change generally gets round the ambiguity in the naming of
> header files generated from inner classes by explicitly specifying an
> output file name for members of EXPORTED_inner.  By default, gjavah
> keeps the $ in the filename, while javah replaces it with _ -- neither
> behaviour is formally specified.

I like this change. Traditionally the various javah commands (gcjh,
kaffeh, gjavah) didn't use the same default output name. So adding an
explicit -o makes this much more robust.

> The second more specific change adds
> sun.java2d.opengl.OGLContext$OGLContextCaps to EXPORTED_inner as it
> doesn't seem to be added and thus generated at all, even with the
> wrong output name.

This one seems correct, although I cannot see how it worked before.

> There's still an issue; the build can now find the header but javah
> and gjavah appear to name them differently:
> 
> ../../../src/share/native/sun/java2d/opengl/OGLContext.c:855: error:
> 'sun_java2d_opengl_OGLContext_OGLContextCaps_CAPS_TEXNONSQUARE'
> undeclared (first use in this function)
> 
> gjavah only generates a subset and encodes them wrongly:
> 
> #define sun_java2d_opengl_OGLContext_00024OGLContextCaps_CAPS_STORED_ALPHA 2L

I believe gjavah is correct here.
The class name is "OGLContext$GLContextCaps". Which contains according
to the jni C translation rules contains the escape sequence _0XXXX where
the XXXX is 0024 for the unicode character $.

I don't know how the openjdk javah gets the single underscore. If you
wanted to encode it as OGLContext_GLContextCaps (as the default output
name hints is what javah prefers), then the underscore would translate
to _1, giving "OGLContext_1GLContextCaps".

This is all a bit unfortunate since the .c source code does use these
constants literally. Easiest solution for now seems a simple sed
invocation on the resulting .h file that turns a the sequence '_00024'
into a single underscore '_'. A better recommendation might be to not
mix inner classes and native methods since the results don't seem to be
very consistent across implementations (of javah).

Cheers,

Mark

Reply via email to