android - Android .apk 文件中缺少资产
问题描述
我在 libfont 中使用本机android 示例: https ://github.com/julienr/libfont来制作可以显示文本的 Android C++ 应用程序。
构建工具是 Visual Studio https://devblogs.microsoft.com/cppblog/android-and-ios-development-with-c-in-visual-studio/。
C/C++ 代码位于 jni 子目录中,字体文件 LiberationSans-Bold.ttf 位于 libfont 示例的 assets 子目录中。
该应用程序可以编译并构建,但字体文件未包含在最终的 .apk 中
//
// To test if the assets are in the assets directory
//
bool _testFont()
{
AAssetManager* manager = getApp()->activity->assetManager;
AAssetDir* assetDir = AAssetManager_openDir(manager, ""); // Open root assets dir, assetDir is not NULL
const char* fileName = AAssetDir_getNextFileName(assetDir); // Get first filename there -> fileName is NULL
}
//
// Original code
//
bool _loadFont()
{
LOGI("Loading font");
AAssetManager* manager = getApp()->activity->assetManager;
AAsset* fontFile = AAssetManager_open(manager, "LiberationSans-Bold.ttf", AASSET_MODE_BUFFER);
//
// Here fontfile is always NULL
//
if (!fontFile)
{
LOGE("Error loading font file");
return false;
}
const void* fontData = AAsset_getBuffer(fontFile);
off_t fontLen = AAsset_getLength(fontFile);
font = fontlib::FTLib::getInstance()->loadMemoryFont((const char*)fontData, fontLen, 30);
AAsset_close(fontFile);
if (!font)
{
LOGE("Error loading font");
return false;
}
return true;
}
所以我的问题是: 构建过程中的什么机制使链接器带来资产目录中的文件?
解决方案
我终于设法包含字体文件。使用 custom_rules.xml 似乎是完成此任务的正确方法,但我对这种方法没有任何运气。相反,我将 assets 文件夹放在 Packaging 项目文件夹中,并在文件(Solution_name).Packaging.androidproj中添加了三行
<ItemGroup>
<Content Include="assets\LiberationSans-Bold.ttf" />
</ItemGroup>
然后字体文件内容包含在 .apk 中,并且可以使用 Asset Manager 访问,如我之前的帖子中所述。
推荐阅读
- apache - 使用 .htaccess 重写合成器的 url
- html - WordPress 未显示 SVG 笔划路径
- r - 闪亮的输入附加数据帧
- python - TensorFlow flatten vs numpy flatten 函数对机器学习训练的影响
- python - PyMongo:如何使用聚合并将结果存储到另一个集合?
- angular - 加载控制器错误
- coffeescript - 为什么 Atom 片段需要在其正文中一次使用四个反斜杠才能打印一个反斜杠
- meshlab - 如何在meshlab中展平2个网格
- ios - 如何确定多个 => 约束的优先级,以便它们按特定顺序生效
- google-cloud-platform - 如何从谷歌云功能调用谷歌数据处理作业