我有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 FAILED :: && / home / user / Android / Sdk / ndk-bundle / toolchains / llvm / prebuilt / linux-x86_64 / bin / clang --target = i686 -none-linux-android -gcc-toolchain = / home / user / 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 / us er / 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/libs/x86/libgnustl_static.a”&&:/ home / user / AndroidStudioProjects / project / app / src / main / cpp / native-lib.cpp:28:错误:未定义引用'Tracker :: isTracking()'clang:
错误:链接器命令失败,退出代码为1(使用-v查看调用)ninja:build stopped:子命令失败 .
我的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(跟踪器SHARED $ )和target_link_libraries将我所有的cpp链接在一起 .
2 回答
“链接CXX共享库../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so失败”这是关键点 . “--target = i686-none-linux-android”也许你的项目编译工具链应该使用32位
谢谢大家 . 在阅读了Zamrony和MultipleMonomials的评论后,我再次检查了
Tracker.cpp
和Tracker.hpp
. 我发现我在hpp上声明了isTracking()
,但没有在.cpp文件中定义它 . 在.cpp文件中实现该功能后,它工作正常 .