android - 我应该将我的 freetype 字体加载器指向哪里?

标签 android android-ndk freetype freetype2

我已经成功地将我的字体放到我的 apk 的 assets/ 文件夹中。我目前正在尝试让 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.");

最佳答案

Assets 是开发机器上的文件。它们不是设备上的文件。它们是作为 APK 的 ZIP 存档中的条目。

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

例如,此 Activity 将 PDF 从 Assets 复制到内部存储,以便能够使用 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++ 中对其进行硬编码。

关于android - 我应该将我的 freetype 字体加载器指向哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38127111/

相关文章:

truetype - 无法获得某些带有Freetype的特定.ttf字体的字距调整

android - 旧 Android SDK 版本中的 "Falling back on PROMPT mode since _cordovaNative is missing"错误

java - 如何获取谷歌地图发布版本的 key ?

java - android 中的 speex 支持

android - 为 Android 错误构建 FFMPEG

rust - 如何在 Rust 中使用自由类型绑定(bind)?

visual-studio-2008 - glutBitmapCharacter() 太慢了,有没有在 OpenGL 程序中使用字体的替代方法?

android - 为什么像 Whatsapp 和 Viber 这样的应用程序在 android 的联系人中创建自己的帐户类型?

android - 是否可以监听物理 Android 后退按钮上的触摸?

android - 如何修复 android studio 2.3 NDK 错误?