[OpenJDK 2D-Dev] Why does the OpenGL pipeline not use setupBlitVector?

Jim Graham Jim.A.Graham at Sun.COM
Thu Jun 5 22:45:07 UTC 2008


This is often a problem that can happen if you don't have a prototype 
for the function.  The default passing semantics for floating point is 
to pass them as doubles unless there is a prototype that says that they 
are floats.

Did you get the prototype correct, and did you make sure it was included?

		...jim

Clemens Eisserer wrote:
> Hi again,
> 
> I now inserted printf-statements to see the value of the parameters
> before and after passing them:
> In X11TextRenderer:          numGlpyhs:10, usePositions:0,
> subpixPos:0, rgbOrder:0, lcdc:140, glypx:100.500000,
> glyphy:400.500000, Images: -1376605040, NULL
> In  X11TextRenderer_md: numGlpyhs:10, usePositions:0, subpixPos:0,
> rgbOrder:0, lcdc:140, glypx:0.000000, glyphy:3.392578, Images: 0
> Positions:1081673728
> 
> So somehow it looks like passing the jfloats causes troubles, after
> commenting them out, everything works as expected:
> In X11TextRenderer: numGlpyhs:10, usePositions:0, subpixPos:0,
> rgbOrder:0, lcdc:140, glypx:100.500000, glyphy:400.50000, Images:
> -1376605792
> In _md: numGlpyhs:10, usePositions:0, subpixPos:0, rgbOrder:0,
> lcdc:140, glypx:-0.000000, glyphy:-0.000000, Images: -1376605792,
> Positions:0
> 
> Any idea why passing the jfloats fail?
> 
> Thank you in advance, lg Clemens
> 
> 
> 2008/6/3 Clemens Eisserer <linuxhippy at gmail.com>:
>> Hi Dmitri,
>>
>>>  Did you try to run it with -Xcheck:jni (preferably on a fastdebug
>>>  build)? What does it say?
>> Thanks for the hint, it cleans the array-handle is not valid.
>>
>> I added printf-statements and Hotspot is of course right, the
>> "original" object handle was != NULL, but the one I passed is zero.
>> The strange thing is if I call a method in the same shared library
>> (fontmanager.so) the handle is passed correctly, but when calling into
>> libmawt.so the array-handle is NULL.
>> I pass the array-handles by value, is this ok?
>>
>> For now I could work-arround that by simply calling
>> GetPrimitiveArrayCritical in the first method, however thats somehow
>> strange and I would like to understand where my mistake is to learn of
>> my faults ;)
>>
>> Thanks a lot for your patience, Clemens
>>
>> One thing that also puzzles me is how the compiler knows about
>> AWTXRDrawGlyphList?
>> There's no header-file which specifies it, does the compiler guess?
>> This is the how the code looks like:
>>
>> 1.) In libmawt.so the method which is called and crashes:
>> void AWTXRDrawGlyphList
>>    (JNIEnv *env, jobject self,
>>     jlong dstData, jint numGlyphs, jboolean usePositions,
>>                    jboolean subPixPos, jboolean rgbOrder, jint lcdContrast,
>>                    jfloat glyphListOrigX, jfloat glyphListOrigY,
>>                    jlongArray imgArray, jfloatArray posArray)
>> {
>>    images = (jlong *) (*env)->GetPrimitiveArrayCritical(env, imgArray, NULL);
>> }
>>
>> 2.)The method called from JNI in libfontmanager.so and a test-dummy method:
>> JNIEXPORT void JNICALL Java_sun_font_X11TextRenderer_doDrawGlyphList
>>  //Method called from JNI
>>    (JNIEnv *env, jobject xtr,
>>     jlong dstData, jint totalGlyphs, jboolean usePositions,
>>                    jboolean subPixPos, jboolean rgbOrder, jint lcdContrast,
>>                    jfloat glyphListOrigX, jfloat glyphListOrigY,
>>                    jlongArray images, jfloatArray positions)
>> {
>>  TESTDrawGlyphList(env, xtr, dstData, totalGlyphs, usePositions,
>>  //Does not crash
>>                     subPixPos, rgbOrder, lcdContrast, glyphListOrigX,
>>                     glyphListOrigY, images, positions);
>>
>>  AWTXRDrawGlyphList(env, xtr, dstData, totalGlyphs, usePositions,
>> //Does crash, because images == NULL
>>                     subPixPos, rgbOrder, lcdContrast, glyphListOrigX,
>>                     glyphListOrigY, images, positions);
>> }
>>
>> JNIEXPORT void TESTDrawGlyphList //DummyTestMethod
>>    (JNIEnv *env, jobject self,
>>     jlong dstData, jint numGlyphs, jboolean usePositions,
>>                    jboolean subPixPos, jboolean rgbOrder, jint lcdContrast,
>>                    jfloat glyphListOrigX, jfloat glyphListOrigY,
>>                    jlongArray imgArray, jfloatArray posArray)
>> {
>>    jlong *images;
>>    images = (jlong *) (*env)->GetPrimitiveArrayCritical(env, imgArray, NULL);
>> }
>>
>> These are the outputs when I run the code with Xcheck:jni:
>> Pointer: -1388390664 <- Value of imgArray-handle before passed to the
>> 2nd method in libmawt.so
>> Pointer: 0 <- Passed value
>> FATAL ERROR in native method: Non-array passed to JNI array operations
>>
>> and this is without XCheck:jni:
>> V  [libjvm.so+0x24252b]
>> C  [libmawt.so+0x1fc81]  AWTXRDrawGlyphList+0xa1
>> C  [libfontmanager.so+0xb393]
>> Java_sun_font_X11TextRenderer_doDrawGlyphList+0x113
>> j  sun.font.X11TextRenderer.doDrawGlyphList(JIZZZIFF[J[F)V+0
>>
>> So the first call succeed (which basically does exectly the same, its
>> just in another shared library), but the second time the parameter is
>> not passed :-/
>>



More information about the 2d-dev mailing list