【问题标题】:Building Android NDK app with static library for distribution使用静态库构建 Android NDK 应用程序以进行分发
【发布时间】:2013-03-27 08:39:22
【问题描述】:

我有一个 Android 项目,其中包含一些本机代码,它使用静态库来执行一些 Poco 库函数。我目前在下面的 make 文件中链接了静态库的 arm7 版本。现在,如果我想在 google play 上分发这个应用程序,为了可移植性,我需要在 apk 中包含其他架构。例如,我如何将 arm6 的静态 libPocofoundation.a 和 arm7 的静态 libPocoFoundation.a 包含到 apk 中的共享库中?

include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := PocoFoundation
LOCAL_SRC_FILES := Poco/libPocoFoundation.a   #<- How do i set this conditional-
#                                                 or add multiple architectures?
LOCAL_EXPORT_C_INCLUDES := /Users/poco-1.5.1-all/Foundation/include
LOCAL_EXPORT_CFLAGS := -DFOO=1 -fpermissive
LOCAL_EXPORT_LDLIBS := -llog
include $(PREBUILT_STATIC_LIBRARY)

Android.mk

LOCAL_PATH := $(call my-dir)
ROOT_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
include $(CLEAR_VARS)
LOCAL_PATH = $(ROOT_PATH)

include $(CLEAR_VARS)
#LOCAL_MODULE_TAGS    := eng
LOCAL_ARM_MODE       := arm
LOCAL_MODULE    := JsonPoco # Your own library.
LOCAL_SRC_FILES := JsonPoco.cpp \


 # Your own library source.
LOCAL_WHOLE_STATIC_LIBRARIES := PocoFoundation \
PocoJSON
LOCAL_LDLIBS     := -llog
LOCAL_CFLAGS     := -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY
LOCAL_CPPFLAGS   := -frtti -fexceptions 
include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

    标签: android android-ndk makefile arm static-libraries


    【解决方案1】:

    如果我理解得很好,你想包含这个静态库的不同版本,位于不同的路径中。

    正如 Rajitha 所说,支持多平台的第一步是在 Application.mk 中提及它们。例如,要支持 ARMv5/6 和 ARMv7:

    APP_ABI := armeabi armeabi-v7a
    

    然后在您的Android.mk 中,您需要根据当前正在构建的平台更改用于静态库的路径:

    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
        LOCAL_SRC_FILES := /path/to/armv-7/libPocofoundation.a
    else
        LOCAL_SRC_FILES := /path/to/armv-6/libPocofoundation.a
    endif
    

    例如,如果您想支持 x86,可以在更多架构上执行此 if/else 条件。

    【讨论】:

    • 似乎 eclipse 将我的所有导入都标记为 armeabi:(这是一个问题吗?) 清洁:PocoFoundationArm [armeabi] 清洁:PocoFoundationArm7 [armeabi] 清洁:PocoJSONArm [armeabi] 清洁:PocoJSONArm7 [armeabi ]
    • 我想确实有问题:我检查了我自己的ndk-build clean 的输出,并且每个库仅在其自己的架构下被清理。也许这是 Eclipse 中的一个已知问题? (我个人直接使用ndk-build 命令行工具,而不是Eclipse)。
    • 似乎 eclipse 忽略了我的 armeabi-libraries 但只使用 arm7:/Applications/adt-bundle-mac-x86_64/android-ndk-r8d/build/core/build-binary.mk:419:警告:覆盖目标“obj/local/armeabi/libPocoFoundation.a”的命令预建:libPocoFoundation.a
    【解决方案2】:

    Application.mk中的APP_ABI修改为

    APP_ABI := all
    

    【讨论】:

    • 其他 .a 库的路径如何添加?
    • 如果他们不需要 x86 或其他未来支持的拱形结构,对于这种情况可能过度
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2021-05-25
    相关资源
    最近更新 更多