Android .apk文件中缺少资产

时间:2019-10-16 05:54:47

标签: android c++ native

我正在使用libfont:https://github.com/julienr/libfont中的 native android示例制作一个可以显示文本的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;
}

所以我的问题是: 构建过程中的哪种机制使链接程序将资产目录中的文件带入?

1 个答案:

答案 0 :(得分:0)

我终于设法包含了字体文件。使用custom_rules.xml似乎是完成此操作的正确方法,但是我对这种方法没有任何运气。相反,我将资产文件夹放在Packaging项目文件夹中,并在文件 (Solution_name).Packaging.androidproj

中添加了三行
<ItemGroup>
  <Content Include="assets\LiberationSans-Bold.ttf" />
</ItemGroup>

然后,字体文件的内容包含在.apk中,并且可以按照我之前的文章中的说明使用Asset Manager进行访问。