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

Felipe Heidrich felipe.heidrich at oracle.com
Thu Mar 3 18:59:33 UTC 2016

Mario is correct.

Basically we want to be able to compile and load this library in systems where libfontconfig is not available (or system where the given symbol, FcConfigAppFontAddFile, is not there - maybe system using old version of libfontconfig).

If it works for you, it just means your system has all the right versions of the libraries, but it doesn't mean it works on supported platforms.

Not sure why the common code didn't work for you.
does dlopen(LIB_FONTCONFIG, RTLD_LAZY) return a non-null value ?
does dlsym(handle, "FcConfigAppFontAddFile") return a non-null value ? 


> On Mar 3, 2016, at 7:43 AM, Maurice <info at cuhka.com> 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