2013-07-08 1 views
0

Je suis nouveau à Android, et je me demande comment créer des caractères à partir des actifsSkia Comment créer une typographie à partir d'éléments à l'aide de SkTypeface * CreateFromFile (const char path []);

J'ai mon fichier .ttf dans mon application Android dans le dossier des actifs.

J'utilise du code natif pour créer caractères:

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(); 
} 
} 

En application Android J'appelle:

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

Son retour faux;

Si je crée le dossier sur la carte SD, dans l'appareil, et de mettre toutes mes polices là:

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

Il fonctionne très bien, mais je dois avoir mes polices dans le dossier actif.

+0

Un appel réussi à 'GetStringUTFChars' doit être suivi avec' ReleaseStringUTFChars' lorsque vous avez terminé avec le tableau. (Je ne sais pas quel jeu de caractères/encodage 'SkTypeface :: CreateFromFile' nécessite mais vous lui donnez Unicode/UTF-8 modifié.) –

+0

Merci, mais ces faits que j'avais connus, aussi j'ai besoin de supprimer tes. Mais mon point était de savoir comment SkTypeface :: CreateFromFile (const char path []) fonctionne, si je lui ai donné le chemin de ma police dans les dossiers actifs (projet android), "../assets/fonts/Agora/Agora-Reg.ttf " – IgorB

Répondre

1

Le chemin du fichier n'est pas correct, vous ne pouvez pas utiliser de chemin relatif dans ce cas. J'ai besoin d'utiliser l'Android NDK asset_manager.h et asset_manager_jni.h pour obtenir un descripteur de fichier à passer dans 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; 
    } 
+0

D'où provient le type AssetStream? –