【发布时间】:2018-02-24 02:16:26
【问题描述】:
我有 3 个类,native-lib.cpp、tracker.cpp 和 tracker.hpp, 但是,如果我在 navtive-lib.cpp 中使用 tracker.cpp 中的 isTracking 函数,则会在构建过程中出错。
- 出了什么问题:
任务 ':app:externalNativeBuildDebug' 执行失败。
构建命令失败。 使用参数执行进程 /home/user/Android/Sdk/cmake/3.6.4111459/bin/cmake 时出错 {--build /home/user/AndroidStudioProjects/project/app/.externalNativeBuild/cmake/debug/x86 --target跟踪器} [1/2] 构建CXX对象CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o [2/2] 链接 CXX 共享库 ../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so 失败: : && /home/user/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=i686-none-linux-android --gcc-toolchain=/home/用户/Android/Sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/linux-x86_64 --sysroot=/home/user/Android/Sdk/ndk-bundle/sysroot -fPIC -isystem /home/user/Android/ sdk/ndk-bundle/sysroot/usr/include/i686-linux-android -D__ANDROID_API__=23 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa, --noexecstack -Wformat -Werror=format-security -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a --sysroot /home/user/Android/Sdk/ndk-bundle/platforms /android-23/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack - Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libtracker.so -o ../../../../build/intermediates/cmake/debug/ obj/x86/libtracker.so CMakeFiles/tracker.dir/src/main/cpp/tracker.cpp.o CMakeFiles/tracker.dir/src/main/cpp/native-lib.cpp.o /home/user/Android/Sdk/ndk-bundle/platforms/android-23/arch-x86/usr/lib/liblog.so 。 ./../../../src/main/jniLibs/x86/libopencv_java3.so -lm "/home/user/Android/Sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/库/x86/libgnustl_static.a" && : /home/user/AndroidStudioProjects/project/app/src/main/cpp/native-lib.cpp:28:错误:未定义对“Tracker::isTracking()”的引用 铿锵++:
错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) 忍者:构建停止:子命令失败。
我的 CMakeLists
set (pathToOpenCv /home/user/OpenCV-android-sdk3.2) set (pathToProject /home/user/AndroidStudioProjects/project)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_VERBOSE_MAKEFILE on)
include_directories(${pathToOpenCv}/sdk/native/jni/include)
FILE(GLOB_RECURSE cppfiles "/home/user/AndroidStudioProjects/project/app/src/main/cpp/*.cpp")
add_library(lib_opencv SHARED IMPORTED)
add_library(tracker SHARED ${cppfiles})
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
find_library( log-lib
log ) target_link_libraries(
tracker
${log-lib}
lib_opencv
)
这是我的 native-lib.cpp
#include <jni.h>
#include <string>
#include "tracker.hpp"
using namespace cv;
Tracker tracker;
extern "C"
JNIEXPORT jboolean JNICALL
Java_com_example_user_project_Tracker_isTrackingC(JNIEnv *env, jboolean boolean) {
boolean = tracker.isTracking();
return boolean;
}
可能是什么原因,CMake 无法从 native-lib 中的 tracker.cpp 找到我的函数? 我想我通过在 CMakeLists 中使用 add_library(tracker SHARED ${cppfiles}) 和 target_link_libraries 将我所有的 cpp 链接在一起。
【问题讨论】:
-
我相信这是因为
tracker从未被初始化。 -
您是否尝试将
FILE(GLOB_RECURSE)行替换为您的源文件列表?您不必输入完整路径,只要 CMakeLists.txt 与 .cpp 文件位于同一文件夹中,就可以使用文件名。它看起来很可疑,好像 tracker.cpp 没有被编译。你也可以发tracker.cpp和tracker.hpp吗? -
不了解 clang,但如果它的行为类似于 gcc,那么您的目标文件顺序错误。
-
谢谢,现在可以使用了。我没有初始化 Tracker.cpp 中的 isTracking() 函数,而只初始化了 Tracker.hpp。我认为这是我在 CMakelists 中的问题,昨天没有检查我的 cpp。
标签: c++ cmake android-ndk java-native-interface