【问题标题】:Error in linking C++ static library with android ndk(Error: file format not recognized)将 C++ 静态库与 android ndk 链接时出错(错误:文件格式无法识别)
【发布时间】:2012-01-08 20:36:05
【问题描述】:

我正在尝试在 android 中包含静态 cpp 库。这个库已经编译(在 mac os 上),我有它的包含文件。

这是我的Android.mk 文件

LOCAL_PATH := $(call my-dir)
 include $(call all-subdir-makefiles)
    include $(CLEAR_VARS) 
    LOCAL_MODULE:= utils 
    LOCAL_SRC_FILES:= libUtils.a 
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/utils 
    include $(PREBUILT_STATIC_LIBRARY) 

    include $(CLEAR_VARS) 
    LOCAL_MODULE := sample 
    LOCAL_SRC_FILES := sample_cpp.cpp 
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
    LOCAL_STATIC_LIBRARIES :=  utils
    LOCAL_LDLIBS    := -llog 
    include $(BUILD_SHARED_LIBRARY)

这是Application.mk文件

APP_STL := stlport_static
APP_CPPFLAGS = -fexceptions  

但每当它尝试使用 NDK 编译它时,我都会收到错误

(文件路径)/libUtils.a: 文件无法识别:文件格式无法识别 collect2: ld 返回 1 个退出状态

【问题讨论】:

  • 你能提供file libUtils.a的输出吗?
  • 对不起,我找不到你?输出?
  • 你的库是为安卓编译的吗?如果库包含其他类型处理器(指令集)的代码,它将无法工作!
  • @bert-jan 库是在 mac os 上使用 xcode 编译的。并且适用于 iphone
  • 你需要使用 Cygwin 为 Android 编译它,你这样做了吗?

标签: android c++ java-native-interface android-ndk


【解决方案1】:

从 cmets 等听起来你试图使用库的非 arm 版本。您应该使用 ndk 构建库。该文档甚至包含有关如何执行此操作的文档。

例如,构建 sigc++ 可能类似于(来自我的一个项目,其中 sigc++ 位于 sigc++ 子目录中)

# SIGC++ Library built as static library
LOCAL_MODULE := sigc
LOCAL_PATH = $(CURRENT_DIR)
LOCAL_CPP_EXTENSION := .cc

LOCAL_SRC_FILES :=    sigc++/signal.cc       sigc++/signal_base.cc  sigc++/trackable.cc 
LOCAL_SRC_FILES +=    sigc++/functors/slot_base.cc  sigc++/adaptors/lambda/lambda.cc 
LOCAL_SRC_FILES += sigc++/connection.cc sigc++/functors/slot.cc

LOCAL_C_INCLUDES := sigc++

include $(BUILD_STATIC_LIBRARY)

但是您应该真正阅读编译链接的工作原理。恐怕使用 ndk 为 android 构建比使用 Xcode 或 Msvc 更底层。

【讨论】:

  • +1 兄弟解释。让我看看文档。然后尝试编译它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多