首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Skia如何使用SkTypeface* CreateFromFile(const char path[])从资产创建字体;

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

Stack Overflow用户
提问于 2013-07-09 00:20:31
回答 1查看 1.6K关注 0票数 0

我是Android新手,我想知道如何从资源中创建字体

我在我的Android应用程序的assets文件夹中有我的.ttf文件。

我正在使用原生代码来创建字体:

代码语言:javascript
复制
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应用程序中,我调用:

代码语言:javascript
复制
boolean isWorking = NativeSkia.getTestFromNative("../assets/fonts/Agora/Agora-Reg.ttf"); 

其返回值为false;

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

代码语言:javascript
复制
boolean isWorking = NativeSkia.getTestFromNative("/mnt/sdcard/fonts/Agora/Agora-Reg.ttf");

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-11 19:26:40

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

代码语言:javascript
复制
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;
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17531433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档