1

我已经在 android 上编译了 freetype 2.4.2,任何时候我尝试使用 FT_Set_Char_Size() 它都会在 FT_Request_Size() 函数中的 ftobjs.c 文件中崩溃这一行

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

我的代码在 Windows、Linux、Mac、iPhone 和 iPad 上运行良好。但这是交易。在我使用 /Za“禁用语言扩展”编译 freetype 之前,我遇到了完全相同的问题,在 Windows (vc++) 上的同一位置发生了同样的崩溃。

所以我很确定这是在 Android 上编译 freetype 的方式导致了崩溃。我已经查找了如何在 android 上禁用语言扩展但无济于事。

这是我的免费类型的 Android.mk 文件

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)

我的完整项目可以在这里找到

    http://digitalknob.googlecode.com

它编译得很好,我没有收到任何错误。只是我使用 FT_Set_Char_Size() 时的崩溃。现在让我发疯了几天:P非常感谢任何帮助。

4

1 回答 1

1

这是答案。事实证明,问题一直是从 .apk 文件中加载字体文件,因为它在技术上是压缩的。使用 SDL,我们使用 SDL_RWops 在 .apk 文件的 assets 文件夹中加载字体文件。我们使用 ftgles 将字体文件加载到 OpenGLES 中。完整示例可在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);

如果您不使用 SDL,则需要 zlib 或其他东西来访问字体文件。

于 2012-09-01T22:45:29.163 回答