且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何加载FTGLES(或任何其他文本渲染)为Android

更新时间:2022-11-03 08:01:31

我不认为你需要编写所有的包装器。

一起来看看。

我的FreeType Android.Mk文件看起来像这样

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)

LOCAL_C_INCLUDES + = \
    $(LOCAL_PATH)/构建\
    $(LOCAL_PATH)/包括

LOCAL_SRC_FILES:= \
    SRC /基/ ftbbox.c \
    SRC /基/ ftbitmap.c \
    SRC /基/ ftglyph.c \
    SRC /基/ ftstroke.c \
    SRC /基/ ftxf86.c \
    SRC /基/ ftbase.c \
    SRC /基/ ftsystem.c \
    SRC /基/ ftinit.c \
    SRC /基/ ftgasp.c \
    SRC /光栅/ raster.c \
    SRC / SFNT / sfnt.c \
    SRC /平/ smooth.c \
    SRC /自动调整/ 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

包括$(BUILD_STATIC_LIBRARY)
 

我ftgles Android.mk文件看起来像这样

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_MODULE:= FTGLES
LOCAL_CFLAGS:= -I $(LOCAL_PATH)/../的FreeType /包括

LOCAL_C_INCLUDES:= $(LOCAL_PATH)/ src目录\
$(LOCAL_PATH)/src/iGLU-1.0.0/include

LOCAL_SRC_FILES:= \
SRC / FTBuffer.cpp \
SRC / FTCharmap.cpp \
SRC / FTContour.cpp \
SRC / FTFace.cpp \
SRC / FTFont / FTBitmapFont.cpp \
SRC / FTFont / FTBufferFont.cpp \
SRC / FTFont / FTFont.cpp \
SRC / FTFont / FTFontGlue.cpp \
SRC / FTFont / FTOutlineFont.cpp \
SRC / FTFont / FTPixmapFont.cpp \
SRC / FTFont / FTPolygonFont.cpp \
SRC / FTFont / FTTextureFont.cpp \
SRC / FTGL / ftglesGlue.cpp \
SRC / FTGlyph / FTBitmapGlyph.cpp \
SRC / FTGlyph / FTBufferGlyph.cpp \
SRC / FTGlyph / FTGlyph.cpp \
SRC / FTGlyph / FTGlyphGlue.cpp \
SRC / FTGlyph / FTOutlineGlyph.cpp \
SRC / FTGlyph / FTPixmapGlyph.cpp \
SRC / FTGlyph / FTPolygonGlyph.cpp \
SRC / FTGlyph / FTTextureGlyph.cpp \
SRC / FTGlyphContainer.cpp \
SRC / FTLayout / FTLayout.cpp \
SRC / FTLayout / FTLayoutGlue.cpp \
SRC / FTLayout / FTSimpleLayout.cpp \
SRC / FTLibrary.cpp \
SRC / FTPoint.cpp \
SRC / FTSize.cpp \
SRC / FTVectoriser.cpp \
SRC / IGLU-1.0.0 / libtess / dict.c \
SRC / IGLU-1.0.0 / libtess / geom.c \
SRC / IGLU-1.0.0 / libtess / memalloc.c \
SRC / IGLU-1.0.0 / libtess / mesh.c \
SRC / IGLU-1.0.0 / libtess / normal.c \
SRC / IGLU-1.0.0 / libtess / priorityq.c \
SRC / IGLU-1.0.0 / libtess / render.c \
SRC / IGLU-1.0.0 / libtess / sweep.c \
SRC / IGLU-1.0.0 / libtess / tess.c \
SRC / IGLU-1.0.0 / libtess / tessmono.c \
SRC / IGLU-1.0.0 / libutil中/ error.c \
SRC / IGLU-1.0.0 / libutil中/ glue.c \
SRC / IGLU-1.0.0 / libutil中/ project.c \
SRC / IGLU-1.0.0 / libutil中/ registry.c

LOCAL_CFLAGS + = -DGL_GLEXT_PROTOTYPES -DFTGL_LIBRARY_STATIC
LOCAL_LDLIBS:= -ldl -lGLESv1_CM -lGLESv2 -llog

LOCAL_STATIC_LIBRARIES:=的FreeType

包括$(BUILD_SHARED_LIBRARY)
 

您可能会得到一些找不到gl.h错误。解决这些问题指向正确的地方。

现在我的主要Android.mk文件

  LOCAL_PATH:= $(叫我-DIR)
包括$(CLEAR_VARS)
LOCAL_MODULE:=主
SDL_PATH:= ../SDL

LOCAL_C_INCLUDES:= \
$(LOCAL_PATH)/ $(SDL_PATH)/包括\
$(LOCAL_PATH)/../的FreeType /包括\
$(LOCAL_PATH)/../ ftgles / src目录\
../../../src/TestApp

LOCAL_CFLAGS:= \
-DFTGL_LIBRARY_STATIC

LOCAL_SRC_FILES:= $(SDL_PATH)/src/main/android/SDL_android_main.cpp \
../../../src/TestApp/app.cpp

LOCAL_SHARED_LIBRARIES:= SDL2 FTGLES

LOCAL_LDLIBS:= -lGLESv1_CM -llog

包括$(BUILD_SHARED_LIBRARY)
 

一切编译和伟大工程。我可以调用的FreeType和ftgles所有的C / C ++函数。我不能调整字体但是。 我有一个线程约在这里。

Freetype FT_Request_Size()崩溃在Android

DigitalKnob

I am tasked with writing an application that uses OpenGL ES 1.0 (or 1.1 if necessary) and I need to be able to render text on the screen. Bitmap text and textured fonts aren't really a choice here. I know for iOS there's FTGLES, which states that android support is in the "near future", but given the deadlines on my project, I need an answer (whether it works/could work/doesn't work/etc) much sooner than "the near future" unfortunately.

I've scoured through posts here and other places and haven't found much of anything that helps. I've tried using the JNI and NDK in Eclipse, but also nothing useful has come from that. I'd greatly appreciate if someone can point me in the right direction. I've also tried jumpcore, but the application isn't native code, it's all written in Java. I'm a bit surprised someone hasn't already resolved this (in a fashion that I could have found by now). Thanks to any and all that help me find a solution for this.

EDIT:

In the JNI folder, I placed the source (each in its own subfolder) for freetype and ftgles. I also had to compile a different version of sqlite to enable RTREE. I was getting caught up initially because I was compiling the wrong files. Hopefully this proves to be helpful.

Here's the Make file for the FTGLES Portion of the native code:

include $(CLEAR_VARS)

include $(JNI_DIR)/freetype/Android.mk

LOCAL_PATH := $(JNI_DIR)

include $(CLEAR_VARS)

GLES_PATH := $(JNI_DIR)/include/
FTGL_PATH := ftgles
FREETYPE_PATH := freetype
GLU_PATH := $(FTGL_PATH)/src/iGLU-1.0.0

FULL_FTGL_PATH := $(LOCAL_PATH)/$(FTGL_PATH)
FULL_FT_PATH := $(LOCAL_PATH)/$(FREETYPE_PATH)
FULL_GLU_PATH := $(LOCAL_PATH)/$(GLU_PATH)

FTGL_INCLUDE := -I$(FULL_FTGL_PATH) -I$(FULL_FTGL_PATH)/src -I$(FULL_FTGL_PATH)/src/FTGL -I$(FULL_FTGL_PATH)/src/FTFont -I$(FULL_FTGL_PATH)/src/FTGlyph -I$(FULL_FTGL_PATH)/src/FTLayout
FREETYPE_INCLUDE := -I$(FULL_FT_PATH) -I$(FULL_FT_PATH)/include -I$(FULL_FT_PATH)/include/freetype -I$(FULL_FT_PATH)/include/freetype/config -I$(FULL_FT_PATH)/include/freetype/internal -I$(FULL_FT_PATH)/include/freetype/internal/services -I$(FULL_FT_PATH)/freetype/include/freetype2/freetype -I$(FULL_FT_PATH)/freetype/include/freetype2/freetype/config
GLU_INCLUDE := -I$(FULL_GLU_PATH) -I$(FULL_GLU_PATH)/include -I$(FULL_GLU_PATH)/libtess -I$(FULL_GLU_PATH)/libutil -I$(GLES_PATH)

FTGL_FTFONT_SRC := $(FTGL_PATH)/src/FTFont/FTFont.cpp $(FTGL_PATH)/src/FTFont/FTFontGlue.cpp $(FTGL_PATH)/src/FTFont/FTOutlineFont.cpp $(FTGL_PATH)/src/FTFont/FTPolygonFont.cpp $(FTGL_PATH)/src/FTFont/FTTextureFont.cpp
FTGL_FTGLYPH_SRC := $(FTGL_PATH)/src/FTGlyph/FTGlyph.cpp $(FTGL_PATH)/src/FTGlyph/FTGlyphGlue.cpp $(FTGL_PATH)/src/FTGlyph/FTOutlineGlyph.cpp $(FTGL_PATH)/src/FTGlyph/FTPolygonGlyph.cpp $(FTGL_PATH)/src/FTGlyph/FTTextureGlyph.cpp
FTGL_FTLAYOUT_SRC := $(FTGL_PATH)/src/FTLayout/FTLayout.cpp $(FTGL_PATH)/src/FTLayout/FTLayoutGlue.cpp $(FTGL_PATH)/src/FTLayout/FTSimpleLayout.cpp

FTGL_SRC := $(FTGL_PATH)/src/FTBuffer.cpp $(FTGL_PATH)/src/FTCharmap.cpp $(FTGL_PATH)/src/FTContour.cpp $(FTGL_PATH)/src/FTFace.cpp $(FTGL_FTFONT_SRC) $(FTGL_PATH)/src/FTGL/ftglesglue.cpp $(FTGL_FTGLYPH_SRC) $(FTGL_PATH)/src/FTGlyphContainer.cpp $(FTGL_FTLAYOUT_SRC) $(FTGL_PATH)/src/FTLibrary.cpp $(FTGL_PATH)/src/FTPoint.cpp $(FTGL_PATH)/src/FTSize.cpp $(FTGL_PATH)/src/FTVectoriser.cpp
GLU_SRC := $(GLU_PATH)/libtess/dict.c $(GLU_PATH)/libtess/geom.c $(GLU_PATH)/libtess/memalloc.c $(GLU_PATH)/libtess/mesh.c $(GLU_PATH)/libtess/normal.c $(GLU_PATH)/libtess/priorityq.c $(GLU_PATH)/libtess/render.c $(GLU_PATH)/libtess/sweep.c $(GLU_PATH)/libtess/tess.c $(GLU_PATH)/libtess/tessmono.c
GLU_SRC2 := $(GLU_PATH)/libutil/error.c $(GLU_PATH)/libutil/glue.c $(GLU_PATH)/libutil/project.c $(GLU_PATH)/libutil/registry.c

#DEBUG MODE: Uncomment this and set android:debuggable in the manifest to true
# DEBUGMODE_FLAGS := -DSELF_EDIT
#RELEASE MODE: Comment the above line, uncomment below, android:debuggable false
DEBUGMODE_FLAGS := -DNDEBUG

LOCAL_MODULE    := ftgl
LOCAL_CFLAGS    := -Werror -DFT2_BUILD_LIBRARY=1 -DTARGET_ANDROID $(FTGL_INCLUDE) $(FREETYPE_INCLUDE) $(GLU_INCLUDE) $(DEBUGMODE_FLAGS)
LOCAL_SRC_FILES := $(FTGL_SRC) $(GLU_SRC) $(GLU_SRC2)   
LOCAL_LDLIBS    := -llog -lGLESv1_CM -lGLESv2 -landroid -lEGL -lOpenSLES 
LOCAL_STATIC_LIBRARIES := freetype2-static 

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := ftgles
LOCAL_CFLAGS    := -Werror -DFT2_BUILD_LIBRARY=1 -DTARGET_ANDROID $(FTGL_INCLUDE) $(FREETYPE_INCLUDE) $(GLU_INCLUDE) $(DEBUGMODE_FLAGS)
LOCAL_LDLIBS    := -llog -lGLESv1_CM -lGLESv2 -landroid -lEGL -lOpenSLES
LOCAL_SRC_FILES := ftgleswrapper.cpp
LOCAL_STATIC_LIBRARIES := ftgl freetype2-static

include $(BUILD_SHARED_LIBRARY)

I don't think you need to write all of those wrappers.

Take a look.

My freetype Android.Mk file looks like this

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 ftgles Android.mk file looks like this

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := FTGLES
LOCAL_CFLAGS := -I$(LOCAL_PATH)/../freetype/include

LOCAL_C_INCLUDES := $(LOCAL_PATH)/src \
$(LOCAL_PATH)/src/iGLU-1.0.0/include

LOCAL_SRC_FILES := \
src/FTBuffer.cpp \
src/FTCharmap.cpp \
src/FTContour.cpp \
src/FTFace.cpp \
src/FTFont/FTBitmapFont.cpp \
src/FTFont/FTBufferFont.cpp \
src/FTFont/FTFont.cpp \
src/FTFont/FTFontGlue.cpp \
src/FTFont/FTOutlineFont.cpp \
src/FTFont/FTPixmapFont.cpp \
src/FTFont/FTPolygonFont.cpp \
src/FTFont/FTTextureFont.cpp \
src/FTGL/ftglesGlue.cpp \
src/FTGlyph/FTBitmapGlyph.cpp \
src/FTGlyph/FTBufferGlyph.cpp \
src/FTGlyph/FTGlyph.cpp \
src/FTGlyph/FTGlyphGlue.cpp \
src/FTGlyph/FTOutlineGlyph.cpp \
src/FTGlyph/FTPixmapGlyph.cpp \
src/FTGlyph/FTPolygonGlyph.cpp \
src/FTGlyph/FTTextureGlyph.cpp \
src/FTGlyphContainer.cpp \
src/FTLayout/FTLayout.cpp \
src/FTLayout/FTLayoutGlue.cpp \
src/FTLayout/FTSimpleLayout.cpp \
src/FTLibrary.cpp \
src/FTPoint.cpp \
src/FTSize.cpp \
src/FTVectoriser.cpp \
src/iGLU-1.0.0/libtess/dict.c \
src/iGLU-1.0.0/libtess/geom.c \
src/iGLU-1.0.0/libtess/memalloc.c \
src/iGLU-1.0.0/libtess/mesh.c \
src/iGLU-1.0.0/libtess/normal.c \
src/iGLU-1.0.0/libtess/priorityq.c \
src/iGLU-1.0.0/libtess/render.c \
src/iGLU-1.0.0/libtess/sweep.c \
src/iGLU-1.0.0/libtess/tess.c \
src/iGLU-1.0.0/libtess/tessmono.c \
src/iGLU-1.0.0/libutil/error.c \
src/iGLU-1.0.0/libutil/glue.c \
src/iGLU-1.0.0/libutil/project.c \
src/iGLU-1.0.0/libutil/registry.c

LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DFTGL_LIBRARY_STATIC
LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog

LOCAL_STATIC_LIBRARIES := freetype

include $(BUILD_SHARED_LIBRARY)

You may get some can't find gl.h errors. Fix them to point to the right place.

Now my main Android.mk file

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL

LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/$(SDL_PATH)/include \
$(LOCAL_PATH)/../freetype/include \
$(LOCAL_PATH)/../ftgles/src \
../../../src/TestApp

LOCAL_CFLAGS := \
-DFTGL_LIBRARY_STATIC

LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp \
../../../src/TestApp/app.cpp

LOCAL_SHARED_LIBRARIES := SDL2 FTGLES

LOCAL_LDLIBS := -lGLESv1_CM -llog

include $(BUILD_SHARED_LIBRARY)

Everything compiles and works great. I can call all c/c++ functions in freetype and ftgles. I can not resize fonts however. I have a thread about it here.

Freetype FT_Request_Size() crashes on Android

DigitalKnob