1

我正在尝试使用 NDK r9d 使用 Google Tango 本机 SDK( Bernoulli ) 为 Android 构建本机库。我在链接过程中遇到错误。我在我的 Android.mk 文件中包含了 libtango_client_api.so,如下所示:

LOCAL_MODULE    := LocalModuleName

include $(CLEAR_VARS)
LOCAL_MODULE := tangoclientapi-prebuilt
LOCAL_SRC_FILES = lib/$(TARGET_ARCH_ABI)/libtango_client_api.so
LOCAL_EXPORT_C_INCLUDES := include
include $(PREBUILT_SHARED_LIBRARY)

LOCAL_STATIC_LIBRARIES := android_native_app_glue cpufeatures
LOCAL_SHARED_LIBRARIES := some-other-modules tangoclientapi-prebuilt

LOCAL_CFLAGS += -fexceptions -frtti -x c++ -D___ANDROID___ -DANDROID

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

我使用的 CMAKE 命令如下所示:

cmake -DCMAKE_TOOLCHAIN_FILE="/path/to/android.toolchain.cmake" 
-DANDROID_NATIVE_API_LEVEL=9 
-DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.8 <some-other-defines> ..

运行“make”后出现的链接器错误:

/path/to/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: 
error: DIV usage mismatch between ./obj/local/armeabi-v7a/libtango_client_api.so and output

这告诉我 NDK 正在使用arm-linux-androideabi-4.6链接器,对吗?

因此,我通过实验暂时删除了工具链文件夹,并在重新配置的构建过程中得到了以下信息:

Android NDK: There is no toolchain that supports the armeabi-v7a ABI.    
Android NDK: Please modify the APP_ABI definition in ./jni/Application.mk to use    
Android NDK: a set of the following values: armeabi armeabi-v7a armeabi-v7a-hard mips x86

我使用的 android.toolchain.cmake 文件是 OpenCV 项目从 NDK r8d 开始维护的文件(我只是添加了必要的 ANDROID_SUPPORTED_NDK_VERSIONS ): https ://github.com/taka-no-me/android-cmake

现在回答我的问题。

  • 即使我指定 4.8,怎么可能使用 4.6?
  • 甚至可以在 r10 之前将 libtango_client_api.so 与 NDK 一起使用吗?

POST-ANSWER INSIGHT: 正如 Jason 指出的那样,ANDROID_TOOLCHAIN_NAME cmake 变量与运行“ndk-build”时使用的工具链无关。幸运的是,我真的在我的 CMakeLists.txt 中有一个构建后命令,它运行“ndk-build”来构建我的 JNI 源,该源使用用“make”构建的静态库,因为我忘记指定“NDK_TOOLCHAIN_VERSION”在 Application.mk 中它使用了默认的工具链。非常感谢,杰森!

4

1 回答 1

1
  • 即使我指定 4.8,怎么可能使用 4.6?尝试在 APPLICATION.mk 文件中指定 NDK_TOOLCHAIN_VERSION。cmake 的 -DANDROID_TOOLCHAIN_NAME 参数应该会导致 CMake 构建使用 GCC 4.8,但不会影响运行 ndk-build。4.6 是默认值。

  • 甚至可以在 r10 之前将 libtango_client_api.so 与 NDK 一起使用吗?正如我在评论中提到的,ibtango_client_api.so 应该能够与 r9d 一起使用,但在此之前还没有测试过任何版本。

此外,看起来您正在混合使用 ndk-build 和 CMake,如果您想使用 CMake 构建自己的本机代码并将其链接到客户端库,那么 CMakeLists.txt 中的简单 target_link_libraries() 就足够了。上面的 Android.mk 只有在您使用 ndk-build 时才有意义。对于您的本机代码,您应该需要使用 CMake 和 ndk-build 中的一种,而不是同时使用两者。

于 2015-01-08T20:58:30.863 回答