我正在尝试使用 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 中它使用了默认的工具链。非常感谢,杰森!