android - 如何在 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.
解决方案
我最终使用了我在问题中链接的存储库作为参考。我从那里复制了源代码,它必须是旧版本,因为它包含我的(最新)副本没有的文件。从那里我设置我CMakeLists.txt
编译相同的文件,现在它至少编译(但实际上尝试一些重要的东西)。
推荐阅读
- c++ - 如何使用 cmake 编译多个源文件并生成多个以这些文件名命名的可执行文件
- dart - 和有什么区别?和 !在 Map、List 和 Set 等集合中?
- rust - Rust:无法访问子目录中的函数
- python - 连接没有共同键的表
- javascript - 单击从数组javascript中获取按钮值?
- android - 在 CentOS 无头(无 GUI)服务器中运行 android 模拟器
- powershell - 平均 powershell中单个磁盘的磁盘写入队列长度性能计数器
- c++ - SDL2 未定义对“SDL_CreateWindowAndRenderer”的引用
- c++ - 如何验证字符串以确保没有小于或等于 1 的非数字和整数?
- kotlin - 快速排序越界 (Kotlin)