首页 文章

'undefined reference to'使用Android Studio NDK的功能

提问于
浏览
1

我有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 回答

  • 0

    “链接CXX共享库../../../../build/intermediates/cmake/debug/obj/x86/libtracker.so失败”这是关键点 . “--target = i686-none-linux-android”也许你的项目编译工具链应该使用32位

  • 1

    谢谢大家 . 在阅读了Zamrony和MultipleMonomials的评论后,我再次检查了 Tracker.cppTracker.hpp . 我发现我在hpp上声明了 isTracking() ,但没有在.cpp文件中定义它 . 在.cpp文件中实现该功能后,它工作正常 .

相关问题