FTFactory.java: Fonts loaded by Pango are never registered and always return <null>

Philip Race philip.race at oracle.com
Thu Mar 3 16:20:19 UTC 2016


Since I don't see any code here that looks like it would run only on
an embedded environment then I wonder why Linux desktop users
are not reporting the same problem ?

Did your instrumentation check that both dlopen & dlsym succeeeded ?

-phil.

On 3/3/16, 7:43 AM, Maurice wrote:
> Hmm....  I think I have to agree with you... you are right. Commenting 
> it in didn't give a compiler or linkage error, and it made it work. 
> I'm happy at the moment and tired of the debugging process, but I'll 
> give it more thought later.
>
> Op 03-03-16 om 16:36 schreef Mario Torre:
>> On Thu, Mar 3, 2016 at 2:48 PM, Maurice <info at cuhka.com> wrote:
>>> At the moment the embedded environment I'm using is not able to use
>>> downloaded or external supplied fonts. I've traced through the 
>>> system and
>>> found that it looks like it fails in pango.c FcConfigAppFontAddFile, at
>>> least OSPango.FcConfigAppFontAddFile returns false, thus propagating 
>>> a null
>>> all the way up.
>>>
>>> Checking the pango.c file I noticed something very interesting:
>>> JNIEXPORT jboolean JNICALL OS_NATIVE(FcConfigAppFontAddFile)
>>>      (JNIEnv *env, jclass that, jlong arg0, jstring arg1)
>>> {
>>>      static void *fp = NULL;
>>>      if (!fp) {
>>>          void* handle = dlopen(LIB_FONTCONFIG, RTLD_LAZY);
>>>          if (handle) fp = dlsym(handle, "FcConfigAppFontAddFile");
>>>      }
>>>      jboolean rc = 0;
>>>      if (arg1) {
>>>          const char *text = (*env)->GetStringUTFChars(env, arg1, NULL);
>>>          if (text) {
>>> //            rc = (jboolean)FcConfigAppFontAddFile(arg0, text);
>>>              if (fp) {
>>>                  rc = (jboolean)((jboolean (*)(jlong, const char 
>>> *))fp)(arg0,
>>> text);
>>>              }
>>>              (*env)->ReleaseStringUTFChars(env, arg1, text);
>>>          }
>>>      }
>>>      return rc;
>>> }
>>>
>>> Yes, you see it correctly! The line that actually should register 
>>> the font
>> Pointer to functions make me blind too, but If I'm not reading it
>> wrong, I think this is not a commented code call, it's meant to tell
>> what the code below it does (apparently, it made blind also the
>> author!):
>>
>> FcConfigAppFontAddFile is dloaded into fp, so this totally
>> incomprehensible line:
>>
>> ((jboolean (*)(jlong, const char *))fp)(arg0, text);
>>
>> it's just casting fp to a function that returns a jboolean and takes a
>> jlong and a const char array as argument, hence it becomes again:
>>
>> (jboolean)FcConfigAppFontAddFile(arg0, text);
>>
>> Cheers,
>> Mario
>


More information about the openjfx-dev mailing list