【问题标题】:NDK Android - Can't build ARMv5 and V7 at the same timeNDK Android - 无法同时构建 ARMv5 和 V7
【发布时间】:2013-08-13 19:34:18
【问题描述】:

我遇到了一个奇怪的问题。 我正在为我的 Android 应用程序构建一个共享库。

我不能同时构建 armv5 和 armv7。 如果这样做,在第二次运行时(当 ndk 构建 armV7 库时)我的源文件会出现很多错误,例如:

FinderPatternInfo.o: previous definition here
multiple definition of ...

我的Application.mk

APP_ABI             := armeabi armeabi-v7a
APP_PLATFORM        := android-8
APP_STL             := stlport_static
APP_CPPFLAGS        += -fexceptions

如果我只设置 APP_ABI := armeabi 或 APP_ABI := armeabi-v7a..

有什么想法吗? 感谢您的帮助,

编辑:Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE            := MyModule

MY_LOCAL_INCLUDED_FILES += $(wildcard $(LOCAL_PATH)/*.h)
MY_LOCAL_INCLUDED_FILES += $(wildcard $(LOCAL_PATH)/*.hpp)
MY_LOCAL_INCLUDED_FILES += $(wildcard $(LOCAL_PATH)/bigint/*.h)
... (many includes)

LOCAL_C_INCLUDES        :=  $(subst jni/, , $(MY_LOCAL_INCLUDED_FILES))

MY_LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/*.c)
MY_LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/*.cpp)
MY_LOCAL_SRC_FILES += $(wildcard $(LOCAL_PATH)/bigint/*.c)
.... (many cpp files)

LOCAL_SRC_FILES     :=  $(subst jni/, , $(MY_LOCAL_SRC_FILES))

LOCAL_CFLAGS        := -DNO_ICONV

include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

  • 您的 libs 或 obj 文件夹中是否有两个单独的文件夹,例如 armeabi 和 armeabi-v7a?
  • 嗯,我不确定,但应该是自动的吧?我试图做“ndk-build clean”,但没有任何改变。在过程开始时,我也收到很多错误,例如:“警告:覆盖目标命令”//“警告:忽略目标的旧命令”
  • 在默认情况下, armeabi 和 armeabi-v7a 输出如您所期望的那样被分隔到各自的文件夹中。如果两种体系结构的输出文件夹相同,那么您可能会预料到该错误,因为它已经从以前的构建中定义。我不知道为什么应该打破默认行为,但似乎是这样。如果您确定您的 libs 文件夹不包含 armeabi 和 armeabi-v7a,您可以尝试在 Application.mk 中的适当 if else 语句中使用 NDK_APP_OUT := /path/to/armeabi 和 NDK_APP_OUT := path/to/armeabi-v7a文件夹。
  • 嗯,第一次运行时有一个库被复制到“project\libs\armeabi”中,但第二次由于多个定义而失败。很奇怪,在过程开始时我收到类似“ [exec] C:/Developer/androidndk/android-ndk-r8e/build/core/build-binary.mk:269: warning: overriding commands for target `C :\Developer\androidndk\android-ndk-r8e/apps/ProjectName/project/obj/local/armeabi-v7a/objs/MyModule/aes_modes.o'" ,就像它直接在寻找armv7 ...我尝试重新安装ndk但没有任何改变。
  • "warning: overriding commands for target xxx'' warning: ignoring old commands for target xxx'' GNU make 允许每个目标只指定一次命令(双冒号规则除外)。已定义为具有命令,则发出此警告,第二组命令将覆盖第一组。”也许你应该发布你的 Android.mk。似乎某处有重复,但我不确定这是问题的根源。

标签: android android-ndk java-native-interface shared-libraries


【解决方案1】:

Android make 系统会为每个目标解析一次您的 Android.mk,因此当有两个目标时,您的 MY_LOCAL_SRC_FILES 会两次获取完整的所有 .c 和 .cpp 文件,但仅当有一个目标时,每个都有一个。

如果您的第一个 MY_LOCAL_SRC_FILES 分配使用 := 而不是 +=,我认为它会解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2014-06-03
    • 2012-06-09
    • 2017-11-11
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多