【发布时间】:2019-08-02 07:09:12
【问题描述】:
我有一些通过 JNI 在 Android 中运行的原生 C 代码。实际上,代码也可以在 iOS 上运行。我现在想从我的本机代码中使用第三方库 (FreeType),但我很难理解实现这一目标的最佳方法(我还没有做过很多本机开发)。
我的代码目前通过 CMakeLists.txt 文件在 Android 上构建,如下所示:
# See https://developer.android.com/studio/projects/configure-cmake.html
cmake_minimum_required(VERSION 3.4.1)
include_directories(
src/main/c/
../c/shared/)
FILE(GLOB_RECURSE SharedCHeader ../c/shared/*.h)
FILE(GLOB_RECURSE SharedCSource ../c/shared/*.c)
add_library(
native-lib
SHARED
${SharedCHeader}
${SharedCSource}
src/main/c/gl_wrapper.h
src/main/c/jni.c )
target_link_libraries(
native-lib
EGL
GLESv3)
我已经设法通过this repo 为各种ABI 编译FreeType,这会为每个架构生成一个.a 文件。但是,我不确定如何链接这些文件,以便我的其他本机代码可以使用 FreeType。我还在某处读到静态库和共享库不能混合使用,根据上述CMakeLists.txt,我正在构建一个SHARED 库(我不确定我是否需要) .
我还想将 FreeType 代码复制到我自己的共享代码中,然后将其捆绑到我自己的 native-lib 库中。事实上,这就是我在上面使用GLOB_RECURSE 的原因,这样它就可以获取所有的FreeType 代码。这导致了绝对大量的编译错误,我认为这是由不正确的配置/缺少预处理器定义引起的。这是一个例子:
C:/Users/Me/Repository/project/c/shared/freetype_src/type1/type1.c
In file included from C:/Users/Me/Repository/project/c/shared/freetype_src/type1/type1.c:22:
In file included from C:/Users/Me/Repository/project/c/shared/freetype_src/type1/t1afm.c:20:
In file included from C:/Users/Me/Repository/project/c/shared/freetype_src/type1/t1afm.h:23:
C:/Users/Me/Repository/project/c/shared/freetype_src/type1/t1objs.h:24:10: error: expected "FILENAME" or <FILENAME>
#include FT_INTERNAL_OBJECTS_H
^
似乎没有正确应用预处理器定义,以至于FT_INTERNAL_OBJECTS_H 不应该是空的。我不确定如何验证该理论。
有人可以在这里给我一些指导吗?在我的 Android 应用程序中将 FreeType 代码合并到 C 代码中的最佳方式是什么(请记住,我也希望在 iOS 上做同样的事情)?我实际上需要采取哪些步骤才能实现这一目标?
更新 1
通过确保定义 FT2_BUILD_LIBRARY 符号,我设法取得了一些的进展:
add_definitions(-DFT2_BUILD_LIBRARY)
但是,在解析标头时,仍然出了点问题。我现在得到这个编译错误(只有这个,虽然我确信还有更多隐藏):
C:/Users/Me/Repository/project/c/shared/freetype_src/autofit/aflatin2.c:24:10: error: expected "FILENAME" or <FILENAME>
#include FT_ADVANCES_H
^
1 error generated.
【问题讨论】:
-
如果您可以发送预构建的
.a文件,您可以将它们添加到您的add_library调用中的源列表中。