- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我正在创建一个应用程序,它使用一些链接到程序中的字体库,并且它有一个 API 函数,例如:
void load_font(char* path);
其中路径是字体文件(*.ttf 或 *.otf)的相对路径。
但是,我想在安装过程中包含一些字体(作为二进制文件的一部分)。有没有办法将这些文件的内容包含在二进制文件中,然后将指向这些文件位置的某种指针传递给库函数?我是否必须修改库以更改它读取字体文件的位置?
我正在考虑的另一种方法是将这些文件与安装捆绑在一起,并检测二进制文件本身内的位置,这也可行,但后来我遇到了一些问题,无法找到二进制文件的正确位置(例如,可以从另一个目录运行,或从其他地方链接)。
对于这样的事情,最好的方法是什么(如果有的话)?
最佳答案
我不知道它的可移植性如何,但是 gcc
提供了一种机制来在目标文件中存储任意二进制 blob,并引用它们。
假设我有一个数据文件“test.txt”。将它嵌入到这样的目标文件中:
ld -r -b binary -o test.o test.txt
这将创建符号 _binary_test_txt_start
和 _binary_test_txt_end
,它们可以像这样在 C 模块中使用:
extern char _binary_test_txt_start[];
extern char _binary_test_txt_end[];
int main (int argc, char **argv)
{
int i, size = _binary_test_txt_end - _binary_test_txt_start;
for (i = 0; i < size; i++)
putc (_binary_test_txt_start[i], stdout);
putc ('\n', stdout);
...
}
我只将它用于文本,但我想其他数据也可以。我承认我不知道可以包含的数据量是否有限制——至少几十 kB 似乎没问题。我在 Linux 和 Linux 的 Windows 子系统上使用过这种机制。 gcc
版本之间关于二进制符号的命名方式似乎存在一些差异,但我尝试过的版本产生了
_binary_[filename]_[extension]_start
在 Windows 上有一个资源 API,用于将对象文件中的字体、图像等加载到 Win32 API 对象中,如果您在 Windows 上工作,这可能更合适。
关于c - 在编译的二进制文件中包含一个非文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46737151/
我是一名优秀的程序员,十分优秀!