Google Project Tango NDK 未定义函数参考

Posted

技术标签:

【中文标题】Google Project Tango NDK 未定义函数参考【英文标题】:Google Project Tango NDK undefined reference on functions 【发布时间】:2017-09-07 13:00:37 【问题描述】:

我得到一个编译错误:

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);

...它编译并且枚举在调试中显示为本地,所以它似乎是函数的问题:see image of locals here

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

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

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

即使智能感知正在读取标题,我也没有意识到库没有被复制。我需要在 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

【讨论】:

以上是关于Google Project Tango NDK 未定义函数参考的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 在缓慢衰落,缺少爆发点是关键;Google 明年关闭增强现实项目 Project Tango

Google Tango SDK下载

Google Tango初学者教程

Google Tango 之后的区域学习

Tango Java API常数

Google Tango Java SDK开发:Motion Tracking 运动追踪