我在哪里指向我的freetype字体加载器?

时间:2016-06-30 15:10:03

标签: android android-ndk freetype freetype2

我已成功将我的字体放到我apk上的assets/文件夹中的apk上。我目前正在尝试让Freetype库查看文件夹中的Arial.ttf,但它无法找到它。

APK结构:

apk/
    AndroidManifest.xml
    assets/
        Arial.ttf
    classes.dex
    lib/
    META-INF/
    res/
    resources.arsc

加载字体:

FT_Face face;
if (FT_New_Face(ft, "/assets/Arial.ttf", 0, &face)) // TODO: get font locally
    __android_log_print(ANDROID_LOG_INFO, "SetupGlyphs", "ERROR::FREETYPE: Failed to load font.");

1 个答案:

答案 0 :(得分:1)

资产是开发机器上的文件。它们是设备上的不是文件。它们是ZIP存档中的条目,即APK。

在Java代码中(最有可能),您需要将资产(从AssetManager)复制到文件系统上的本地文件,然后让您的本机代码使用该本地文件系统副本。

例如,此活动将PDF从资产复制到内部存储,以便能够使用FileProvider和第三方PDF查看器查看它:

/***
  Copyright (c) 2013 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    https://commonsware.com/Android
 */

package com.commonsware.android.cp.v4file;

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v4.content.FileProvider;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class FilesCPDemo extends Activity {
  private static final String AUTHORITY="com.commonsware.android.cp.v4file";

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    File f=new File(getFilesDir(), "test.pdf");

    if (!f.exists()) {
      AssetManager assets=getResources().getAssets();

      try {
        copy(assets.open("test.pdf"), f);
      }
      catch (IOException e) {
        Log.e("FileProvider", "Exception copying from assets", e);
      }
    }

    Intent i=
        new Intent(Intent.ACTION_VIEW,
                   FileProvider.getUriForFile(this, AUTHORITY, f));

    i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(i);
    finish();
  }

  static private void copy(InputStream in, File dst) throws IOException {
    FileOutputStream out=new FileOutputStream(dst);
    byte[] buf=new byte[1024];
    int len;

    while ((len=in.read(buf)) > 0) {
      out.write(buf, 0, len);
    }

    in.close();
    out.close();
  }
}

在您的情况下,您将在启动需要字体的JNI代码之前完成此工作。并且,由于路径可能因设备或用户而异,因此请将字体路径传递给JNI代码,而不是尝试在C / C ++中对其进行硬编码。