0

我收到编译错误:

undefined reference to 'TangoService_getConfig' (MoreTeapotsNativeActivity.cpp)

ld returned 1 exit status (collect2.exe)

我正在使用 VisualGDB 在 Visual Studio 2015 中使用tango sdk TangoSDK_Ikariotikos_C.zip 。我还在 Android Studio 中复制了该错误,因此它不是特定于 IDE 的。

我已经开始使用 NDK 示例项目来测试本机活动是否正确部署并在故障排除时降低复杂性。我使用了 VisualGDB MoreTeaPotsNativeActivity,但任何都可以。该应用程序在我们的 ASUS Zenfone AR 上编译和运行。一旦我包含 tango_client_api.h 并添加以下代码,就会出现编译错误:

TangoCoordinateFramePair* Tango_FramePair;
Tango_FramePair = new TangoCoordinateFramePair();
Tango_FramePair->base = TANGO_COORDINATE_FRAME_START_OF_SERVICE;
Tango_FramePair->target = TANGO_COORDINATE_FRAME_DEVICE;
TangoErrorType retval;
// Connect to tango service.
TangoConfig tango_config;
tango_config = TangoService_getConfig(TANGO_CONFIG_DEFAULT);

Tango 头文件有一个用于 C 函数的外部“C”包装器,并且 .o 显示它们已解构,所以我看不出它为什么会失败。
如果我注释掉...

//tango_config = TangoService_getConfig(TANGO_CONFIG_DEFAULT);

...它编译并且枚举在调试中显示为本地人,所以这似乎是函数的问题:请参阅此处的本地人图像

我可能遗漏了一些非常明显的东西,因为 android 对我来说相当新。也许有人可以使用相同的代码块测试 tangoSDK 库并发现问题。令人沮丧的是,我什至无法链接库。我可能遗漏了一些简单的东西,但对我来说并不明显。

任何帮助将不胜感激。

4

1 回答 1

0

我联系了 Sysprogs 支持,他们给了我一个链接: PREBUILT_SHARED_LIBRARY 语法

即使智能感知正在读取标题,我也没有意识到图书馆没有被复制。我需要在 make 文件 (android.mk) 中包含一个引用来复制库(我将 Tango 包含和 lib 文件夹复制到项目 jni 文件夹):

include $(CLEAR_VARS)

LOCAL_MODULE          := tango_client_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_client_api.so

include $(PREBUILT_SHARED_LIBRARY)

我对支持库的附加块做了同样的事情:

include $(CLEAR_VARS)

LOCAL_MODULE          := tango_support_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_support_api.so

include $(PREBUILT_SHARED_LIBRARY)

主模块只需要这个:

LOCAL_SHARED_LIBRARIES := tango_client_api

整个文件如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE          := tango_client_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_client_api.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE          := tango_support_api
LOCAL_SRC_FILES := ../jni/lib/$(TARGET_ARCH_ABI)/libtango_support_api.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := MoreTeapotsNativeActivity
#VisualGDBAndroid: AutoUpdateSourcesInNextLine
LOCAL_SRC_FILES := gdbserver_launcher.c MoreTeapotsNativeActivity.cpp MoreTeapotsRenderer.cpp
LOCAL_C_INCLUDES := jni/include

LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv2
LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
LOCAL_SHARED_LIBRARIES := tango_client_api


include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/ndk_helper)
$(call import-module,android/native_app_glue)
$(call import-module,android/cpufeatures)

在遵循 NDK 示例时,我并没有立即让它工作,但是 Sysprogs 给了我关于我的错误的反馈,我将包括在内。

我试图包括:

LOCAL_MODULE_FILENAME := tango_client_api 

我离开了 lib 和 .so 似乎是约定俗成的。.so 不是必需的,但关闭 lib 会更改导致链接错误的文件名。也就是说,那条线首先是不必要的,因为我删除了它。然后它删除了与此相关的错误。我还没有查看该库是否在运行时工作,因为我现在收到此错误:

java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/com.sample.moreteapots-2/lib/arm64/libMoreTeapotsNativeActivity.so": dlopen failed: library "libbinder.so" not found

但这似乎与 Android 7.0 平台 24 及更高版本的问题有关

系统阻止应用程序动态链接到非 NDK 库

来自/Android/android-sdk/docs/about/versions/nougat/android-7.0-changes.html

于 2017-09-12T11:31:41.963 回答