Skia 如何使用 SkTypeface* CreateFromFile(const char path[]) 从资产创建字体;

Posted

技术标签:

【中文标题】Skia 如何使用 SkTypeface* CreateFromFile(const char path[]) 从资产创建字体;【英文标题】:Skia How to create Typeface from assets using SkTypeface* CreateFromFile(const char path[]); 【发布时间】:2013-07-08 16:20:30 【问题描述】:

我是 android 新手,我想知道如何从资产创建字体

我的 .ttf 文件位于我的 Android 应用程序的 assets 文件夹中。

我正在使用本机代码来创建字体:

class Test

public:
    Test();
    Test(const char* path);
    bool getHasFont() return hasFont;
    ~Test()


private:
   SkPaint paint;
   SkTypeface* typeface;
   bool hasFont;
;

Test::Test(const char* path)


LOGI(path);
typeface = SkTypeface::CreateFromFile(path);        
if(typeface != NULL)
    hasFont = true;
else
    hasFont = false;




JNIEXPORT jboolean JNICALL Java_com_example_Test_NativeSkia_getHelloFromNative(JNIEnv *env,
        jclass clazz, jstring path) 

const char *nativeString = env->GetStringUTFChars(path, 0); 

Test* tes = new Test(nativeString);
return tes->getHasFont();


在我正在调用的 Android 应用程序中:

boolean isWorking = NativeSkia.getTestFromNative("../assets/fonts/Agora/Agora-Reg.ttf"); 

返回false;

如果我在 sd 卡上的设备中创建文件夹,并将我所有的字体放在那里:

boolean isWorking = NativeSkia.getTestFromNative("/mnt/sdcard/fonts/Agora/Agora-Reg.ttf");

它工作正常,但我需要将我的字体放在 assets 文件夹中。

【问题讨论】:

在完成数组后,需要在成功调用GetStringUTFChars 后跟上ReleaseStringUTFChars。 (我不知道SkTypeface::CreateFromFile 需要什么字符集/编码,但你给它的是Unicode/修改过的UTF-8。) 谢谢,但这个事实我已经知道了,我也需要删除 tes。但我的观点是 SkTypeface::CreateFromFile(const char path[]) 是如何工作的,如果我在文件夹 assets(android 项目) 中给她我的字体路径,"../assets/fonts/Agora/Agora-Reg.ttf " 【参考方案1】:

文件路径不正确,在这种情况下您不能使用相对路径。我不需要使用 Android NDK 的asset_manager.h 和asset_manager_jni.h 来获取要传递给Skia 的文件描述符。

JNIEXPORT jboolean JNICALL Java_com_example_KernMe_NativeSkia_getHelloFromNative(JNIEnv *env,
        jclass clazz, jobject assetManager, jstring path) 

    AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
    if (mgr == NULL) 
       return false;
    const char *nativeString = env->GetStringUTFChars(path, 0); 


    AAsset* asset = AAssetManager_open(mgr, nativeString, AASSET_MODE_BUFFER);
    if (NULL == asset)
        return false;

    SkStream* stream = new AssetStream(asset, true);
    SkTypeface* face = SkTypeface::CreateFromStream(stream);
    if(face == NULL)
        return false;


    env->ReleaseStringUTFChars(path, nativeString);
    AAsset_close(asset);

    return true;
    

【讨论】:

AssetStream 类型从何而来?

以上是关于Skia 如何使用 SkTypeface* CreateFromFile(const char path[]) 从资产创建字体;的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VS2012 构建 Skia 库项目

如何在 Flutter Web 中使用 Skia/CanvasKit?

如何在 Windows 或 Linux 上使用 Skia

如何在skia中从SkPicture生成skp文件?

Skia 或 Direct2D 如何使用 GPU 渲染线条或多边形?

如何从 Skia 路径几何中获取网格?