0

私は Android が初めてで、アセットから Typeface を作成する方法を考えています

私の Android アプリケーションの assets フォルダーに .ttf ファイルがあります。

私は書体を作成するためにネイティブコードを使用しています:

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 フォルダーに入れる必要があります。

4

1 に答える 1

2

ファイル パスが正しくありません。この場合、相対パスは使用できません。Skia に渡すファイル記述子を取得するために、Android NDK の asset_manager.h と asset_manager_jni.h を使用する必要はありません。

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;
    }
于 2013-07-11T11:26:40.213 に答える