我的任務是編寫使用OpenGL ES 1.0(或1.1,如果需要)的應用程序,並且我需要能夠在屏幕上呈現文本。位圖文本和紋理字體在這裏並不是真正的選擇。我知道iOS上有FTGLES,其中規定Android支持處於「不遠的將來」,但鑑於我的項目最後期限,我需要一個答案(無論是否有效/可能工作/不工作/等)比不幸的是「不久的將來」。如何爲Android加載FTGLES(或任何其他文本呈現)
我搜遍了這裏和其他地方的帖子,並沒有發現任何有用的東西。我已經嘗試在Eclipse中使用JNI和NDK,但也沒有任何用處。如果有人能指出我正確的方向,我將不勝感激。我也嘗試了jumpcore,但應用程序不是本地代碼,它全部用Java編寫。我有點驚訝,有人還沒有解決這個問題(以我現在可以發現的方式)。感謝任何和所有幫助我找到解決方案。
編輯:
在JNI文件夾中,我放置在源(每個在其自己的子文件夾)的FreeType和ftgles。我也必須編譯不同版本的sqlite來啓用RTREE。最初是因爲我編譯錯誤的文件而陷入困境。希望這證明是有幫助的。
下面是本機代碼的FTGLES部分Make文件:
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)
我結束了我自己解決這一點。我必須將freetype和ftgles C++源代碼放入Eclipse中的項目中,並使用Android NDK一次編譯它。我創建了一個非常複雜的Android.mk,然後不得不編寫自己的包裝器來合併我想要的功能。缺點是本地調用速度較慢,所以當有大量文本時,它會增加一些額外的時間來渲染每一幀。我的普通OpenGL幀需要大約400-600毫秒的渲染時間,當有文本時,它可能需要1秒鐘(有時2-3秒)才能渲染。這不是理想的,但它的工作原理。 – s0n1c 2012-04-04 11:18:44