如何使用CMAKE将FFTW添加到Android项目中
How to add FFTW to an Android project using CMAKE
我正在尝试使用CMAKE将FFTW添加到我的Android项目中,但我无法这样做。如果有人成功地将FFTW添加到他们的Android项目中,我将非常感谢任何帮助,特别是如果它是通过cmake而不是ndk-build完成的。
以下是我目前在 CMakeLists.txt 文件中用于将 FFTW 添加到项目中的代码:
set(buildDir ${CMAKE_CURRENT_BINARY_DIR}/build)
add_subdirectory(C:/Users/reyna/Documents/HMC/Clinic/Test/fftw-3.3.8 ${buildDir})
set(
FFTW3_DIR ${buildDir}
CACHE PATH "Path to internally built FFTW3Config.cmake"
FORCE
)
find_package(FFTW3 CONFIG REQUIRED)
我收到以下错误消息:
CMake Error at .cxx/cmake/debug/armeabi-v7a/build/FFTW3Config.cmake:13 (include):
文件 C:/Users/reyna/Documents/HMC/Clinic/AmazonAppTest/Test2/app/.cxx/cmake/debug/armeabi-v7a/build/FFTW3LibraryDepends.cmake 由 export() 命令生成。它不能用作 include() 命令的参数。请改用 ALIAS 目标通过备用名称引用目标。
>
调用堆栈(最近一次调用优先):
个最新
CMakeLists.txt:69 (find_package)
* 尝试:
使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获取更多日志输出。使用 --scan 运行以获取完整的见解。
* 获取更多帮助 https://help.gradle.org
构建失败 1s
6 个可操作的任务:1 个已执行,5
有人知道如何解决错误吗?我不确定如何处理这个问题,因为它似乎来自 FFTW Cmake 文件。
编辑
因此,我能够在 CMAKE 中使用以下命令让 FFTW 以双精度(默认值)工作:
set(CMAKE_INSTALL_PREFIX C:/Users/reyna/Documents/HMC/Clinic/FFTW_Install)
set( FFTW3_DIR C:/Users/reyna/Documents/HMC/Clinic/fftw/fftw-3.3.8)
add_subdirectory(${FFTW3_DIR} ${CMAKE_CURRENT_BINARY_DIR}/fftw_build)
include_directories(C:/Users/reyna/Documents/HMC/Clinic/FFTW_Install/include/)
target_link_libraries (native-lib fftw3 AudioEngine log oboe android)
根据我对CMake的了解,我认为发生的事情如下:
第一个
set()
命令只是将CMAKE_INSTALL_PREFIX
变量设置为我选择的位置。我现在不使用它,但它以后可能会有用。下面会详细介绍...第二个
set()
命令将变量设置为计算机中 FFTW 的安装位置。add_subdirectory()
命令运行位于 FTTW 安装目录中的 CMakeList.txt 文件,该文件将项目构建到${CMAKE_CURRENT_BINARY_DIR}/fftw_build
指定的目录中,该目录位于app/.cxx/cmake/debug/${abi}/fftw_build
中。由于 CMakeList.txt 文件中有一个add_library()
命令,该命令可以创建一个 .so 库(对于 x86,由于某种原因它创建了一个 .a 库),我可以将我的本机库链接到该目标。我发现这些库被添加到app/build/intermediates/cmake/obj/${abi}
文件夹中(x86 除外,由于某种原因将其添加到 fftw_build 文件夹中)。链接是使用上面显示的target_link_libraries()
命令完成的。include_directories()
命令使fftw3.h
文件对项目可见。但是,除非您运行安装命令,否则不会将fftw3.h
文件复制到 Android 项目中的任何位置。FFTW3 CMakeList.txt 文件有多个在构建时不会运行的安装命令。如果运行位于生成文件夹中的cmake_install.cmake
文件,则会执行这些命令。您可以使用include()
命令执行此操作。不确定这是否是通常的做法,但这就是我发现你可以做到的方式。我没有运行安装命令,因为我发现没有必要。
问题是,我想要单精度,我认为如果我只是将 FFTW3 CMakeList 文件中的ENABLE_FLOAT
选项设置为ON
.txt就可以获得。如果我这样做,并执行上面的步骤 1-3(同时链接到 fftw3f 而不是 fftw3),我会收到以下错误:
生成命令失败。
执行进程 C 时出错:\Users\reyna\AppData\Local\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe 带有参数 {--build C:\Users\reyna\Documents\HMC\Clinic\AmazonAppTest\Test2\app.cxx\cmake\debug\armeabi-v7a --target native-lib} [1/1] 链接 CXX 共享库 .....\build\mediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so失败: cmd.exe/C "cd .&& C:\Users\reyna\AppData\Local\Android\Sdkdk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=C:/Users/reyna/AppData/Local/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/reyna/AppData/Local/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -wa,--noexecstack -wformat -werror=format-security -O0 -fno-limit-debug-info -wl,--exclude-libs,libgcc.a -wl,--exclude-libs,libatomic.a -static-libstdc++ -wl,--build-id -wl,--warn-shared-textrel -wl,--fatal-warnings -wl,--exclude-libs,libunwind.a -wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -wl,-soname,libnative-lib.so -o ........\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -lfftw3f ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libAudioEngine.so -llog -landroid ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libCallback.so -llog ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/liboboe.so -latomic -lm && cd ." C:/Users/reyna/AppData/Local/Android/Sdk/ndk/20.0.5594570/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: error: 找不到 -lfftw3fclang++:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
忍者:构建停止:子命令失败。
我让单精度构建工作,但它不是一个很好的解决方案,因为我认为如果我做"清理项目"或"刷新链接C++项目"之类的东西,它将不再工作,我将不得不重复我将在下面描述的过程:
1)我在问题中指定的CMake参数仍然相同。但是,我进入了FFTW3的CMakeLists.txt并将ENABLE_FLOAT
选项设置为ON
。在此过程的此时,单个精度更改将仅反映在 x86 ABI 版本中。所以,当我尝试构建项目时,Android Studio 会抱怨找不到 armeabi-v7a 构建的 fftw3f 库。
2)我提出了一个我之前见过的想法,我们需要为每个ABI构建FFTW3,所以我在defaultConfig{}中的build.gradle文件中添加了以下内容:
externalNativeBuild {
cmake {
arguments "-DANDROID_ABI=x86_64"
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
我将 -DANDROID_ABI 标志更改为我想要构建的 ABI。我真的不确定是否需要 abiFilters 的东西,但我非常有信心需要参数标志。我目前已经注释掉了 abiFilter 的东西,因为在将我的应用程序安装到我的手机中后,我会收到关于找不到我的本机库的错误。
3)我用每个ABI标志构建了Android项目,这有点麻烦,所以也许我需要做构建多个apks方法。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法将标准库导入本机 android 项目中的头文件
- 将 CPP 类添加到 Android 项目中
- C++17 标准库包括不适用于 Visual Studio 2017 中的 Android 项目
- 如何在Android Studio中将C++文件正确链接到现有的Android项目?
- 如何使用CMAKE将FFTW添加到Android项目中
- 如何将 Android 项目与 libandroid 与 Cmake 联系起来
- NDK - 包含一个预构建的库,并在 Android 项目中调用本机函数
- 使用C 支持创建Android项目的正确方法
- 在 CMAKE 中包含来自 Android 项目不同文件夹的静态库
- 如何将文件添加到Android项目中,然后使用NDK加载它
- 使用Java和C 一起使用Android项目
- Qt Android项目突然不会开始编译
- 无法构建opengl es 2.0 c++原生android项目.(致命错误:android/sensor.h:没有这样
- 将 cpp 文件添加到 cocos2d-x 项目 android 项目
- 如何从终端为本机应用程序创建android项目
- 将开源 JniLibs 合并到自己的 android 项目中
- 构建 android 项目会产生错误 2
- 如何将OpenCV集成到Qt Creator Android项目中
- 在Qt Android项目中使用OpenCV时的链接顺序