I've compiled freetype 2.4.2 on android and any time I try to use FT_Set_Char_Size() it will crash in the ftobjs.c file in the FT_Request_Size() function at this line

error = clazz->request_size( face->size, req );    //line 2832

My code works perfectly fine on Windows, Linux, Mac, IPhone and IPad. But here is the deal. I was having the exact same issue, same crash at the same spot on Windows (vc++) until I compiled freetype with /Za "Disable Language Extensions".

So I'm pretty sure it's how freetype is being compiled on Android that is causing the crash. I've looked up how to Disable Language Extensions on android with no avail.

here is my Android.mk file for freetype

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH)/builds \
    $(LOCAL_PATH)/include

LOCAL_SRC_FILES:= \
    src/base/ftbbox.c \
    src/base/ftbitmap.c \
    src/base/ftglyph.c \
    src/base/ftstroke.c \
    src/base/ftxf86.c \
    src/base/ftbase.c \
    src/base/ftsystem.c \
    src/base/ftinit.c \
    src/base/ftgasp.c \
    src/raster/raster.c \
    src/sfnt/sfnt.c \
    src/smooth/smooth.c \
    src/autofit/autofit.c \
    src/truetype/truetype.c \
    src/cff/cff.c \
    src/psnames/psnames.c \
    src/pshinter/pshinter.c \
    src/type1/type1.c \
    src/cid/type1cid.c \
    src/pfr/pfr.c \
    src/type42/type42.c \
    src/winfonts/winfnt.c \
    src/pcf/pcf.c \
    src/psaux/psaux.c \
    src/bdf/bdf.c \
    src/gzip/ftgzip.c \
    src/lzw/ftlzw.c

LOCAL_CFLAGS += -DFT2_BUILD_LIBRARY
LOCAL_MODULE := freetype
LOCAL_LDLIBS := -ldl -llog

include $(BUILD_STATIC_LIBRARY)

My full project can be found here

    http://digitalknob.googlecode.com

It compiles fine and I get no errors. Just the crash when I use FT_Set_Char_Size(). Driving me crazy for a few days now :P Any help is so greatly appreciated.

有帮助吗?

解决方案

Here is the answer. It turns out the problem the whole time was loading the font file out of the .apk file since it is technically compressed. With SDL, We use SDL_RWops to load the font file within the assets folder of the .apk file. We load the font file into OpenGLES using ftgles. Full example can be found at www.digitalknob.com

SDL_RWops *file = SDL_RWFromFile(filename, "rb"); 

unsigned long fileLen; 
SDL_RWseek(file,0,SEEK_END); 
fileLen=SDL_RWtell(file); 
SDL_RWseek(file,0,SEEK_SET); 

//Allocate memory 
buffer=(unsigned char *)malloc(fileLen+1); 
if (!buffer){ 
   printf("Memory error!\n"); 
   SDL_RWclose(file); 
   return; 
} 

//Read file contents into buffer 
SDL_RWread(file, buffer, fileLen, 1); 
SDL_RWclose(file); 

texture_font = new FTGLTextureFont(buffer, fileLen); 
texture_font->FaceSize(18); 

//don't forget to free your buffer later.
//free(buffer);

If your not using SDL, you'll need zlib or something to access the font file.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top