首页 > 解决方案 > 如何在 Android 中使用我自己的本机代码使用第三方本机代码?

问题描述

我有一些通过 JNI 在 Android 中运行的本机 C 代码。实际上,代码也可以在 iOS 上运行。我现在想从我的本机代码中使用第三方库(FreeType),我很难理解实现这一目标的最佳方法(我没有做过很多本机开发)。

我的代码目前通过一个文件构建在 Android 上CMakeLists.txt,如下所示:

# 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)

我已经设法通过这个 repo.a为各种 ABI 编译 FreeType,这会为每个架构生成一个文件。但是,我不确定如何链接这些文件,以便我的其他本机代码可以使用 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.

标签: androidcmakefreetype

解决方案


我最终使用了我在问题中链接的存储库作为参考。我从那里复制了源代码,它必须是旧版本,因为它包含我的(最新)副本没有的文件。从那里我设置我CMakeLists.txt编译相同的文件,现在它至少编译(但实际上尝试一些重要的东西)。


推荐阅读