2016-06-30 60 views
1

所以我需要在我的Android NDK項目中包含一個用於Freetype字體渲染的.ttf字體文件。我在哪裏放它,以便它將被放在apk中?如何在我的Android NDK項目中包含字體文件(.ttf)?

+0

典型的方法是把它放在'assets /'中。我不太瞭解你將如何使用它,但我的猜測是,你需要將資產(從'AssetManager')複製到文件系統上的本地文件,然後讓你的本地代碼使用本地文件系統副本。 – CommonsWare

+0

資產正常工作。想發佈爲答案? – iHowell

+0

我建議你發佈答案,因爲你可以解釋你如何使用NDK方面的資產。 – CommonsWare

回答

-1

src/main/我創建另一個文件夾assets/旁邊的java/jni/res/文件夾,我放在.ttf文件,並將其上傳到APK。我仍然試圖讓Freetype看到它,因爲目前的命令沒有得到它:

FT_New_Face(ft, "/assets/Arial.ttf", 0, &face); 

但這是另一個問題。

+0

爲什麼標記爲已回答?有關這方面的任何消息?我遇到同樣的問題。 –

1

我將添加我的解決方案,它是通過傳遞assetManager,並在C++端保存對它的引用。字體ttf文件存儲在字體文件夾內的assets文件夾中。

FT_library library; 
FT_Face fontFace; 

AAsset* fontFile = AAssetManager_open(manager, "fonts/Roboto-Medium.ttf", AASSET_MODE_BUFFER); 
off_t fontDataSize = AAsset_getLength(fontFile); 

FT_Byte* fontData = new FT_Byte[fontDataSize]; 
AAsset_read(fontFile, fontData, (size_t) fontDataSize); 
AAsset_close(fontFile); 


if (FT_Init_FreeType(&library)) { 
    LOGE("Could not load library"); 
} 
if (FT_New_Memory_Face(library, (const FT_Byte*)fontData, (FT_Long)fontDataSize, 0, &fontFace)) { 
    LOGE("Load memory failed"); 
} 

傳遞assetManager只是將它作爲一個對象傳遞並在C++端進行轉換。

AAssetManager *manager = AAssetManager_fromJava(javaEnv, assetObject); 
+0

我會補充說這是爲了加載自定義字體,對於系統字體,這是不需要的,因爲您可以直接訪問而不需要AssetManager。 – Adrian

相關問題