使用Android NDK预构建库时构建问题

时间:2012-03-15 20:06:32

标签: android android-ndk

我有一个移植的程序,在创建可执行文件时将多个库链接在一起。我使用独立的工具链构建了所有这些库,并使用独立的工具链,我能够创建一个可在Android设备上运行的可执行文件。所以,我构建的库似乎是功能性的。现在我正在尝试将这些库与应用程序合并。所以,在我的android.mk中我有这样的东西:

LOCAL_PATH := $(call my-dir)
ROOT_PATH := $(LOCAL_PATH)

include $(call all-subdir-makefiles)
include $(CLEAR_VARS)

LOCAL_PATH = $(ROOT_PATH)

LOCAL_MODULE    := test-libs

LOCAL_STATIC_LIBRARIES := staticA
LOCAL_SHARED_LIBRARIES := sharedA sharedB sharedC sharedD
LOCAL_SRC_FILES := test-libs.c

include $(BUILD_SHARED_LIBRARY)

对于每个库,我都有像这样的Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := sharedA

LOCAL_SRC_FILES := sharedA.so

include $(PREBUILT_SHARED_LIBRARY)

当我构建我的项目(在eclipse中)时,我得到了这个:

C:/ndk/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a(unwind-arm.o): In function `__gnu_unwind_pr_common':
/cygdrive/c/ndk/android-ndk-r7b/build/core/build-binary.mk:314: recipe for target `obj/local/armeabi/libtest-libs.so' failed
/tmp/ndk-digit/src/build/../gcc/gcc-4.4.3/libgcc/../gcc/config/arm/unwind-arm.c:1237: undefined reference to `__cxa_call_unexpected'

关于出了什么问题的任何想法?

此外,静态库和其中一个共享库没有任何依赖关系,如果我只包含它们,那么一切都很酷。我的一个共享库只依赖于静态库。如果我只包含那些,但当我包含其他依赖于其他共享库的其他人时,会出现此问题。

更新1:好的,似乎是因为我的Application.mk中的APP_STL设置被忽略了。我在Application.mk中的所有内容是:     APP_STL:= gnustl_shared 如果我复制libgnustl_shared.so并将其视为另一个预建的共享库,我的问题就消失了。知道为什么APP_STL不能正常工作。请注意,我可能搞砸了。我刚升级到使用7b。使用gnustl_shared用于其他应用程序。回滚到7并不能解决问题。我想我在Eclipse中搞砸了一些东西。我使用Eclipse(windows)和sequoyah。

3 个答案:

答案 0 :(得分:1)

看起来链接器正在给你一个错误。你应该做的是以下几点:

在LOCAL_MODULE:= test-libs下添加LOCAL_LDLIBS。在这里,您需要包含编译预编译库时链接的所有库。例如:

LOCAL_LDLIBS := -lgnustl_shared -lgcc -llog -landroid -lstdc++

基本上,您需要确定哪个库包含函数__cxa_call_unexpected。一个快速谷歌显示它可能在libstdc ++。确保在创建预编译库时也链接到此库。

答案 1 :(得分:1)

我认为它可能与异常支持有关。

您是否在代码中使用异常,如果是,您是否正在使用支持异常的运行时库进行编译? (并编译有例外)?。

在ndk文档中的CPLUSPLUS-SUPPORT和STANDALONE-TOOLCHAIN文件中有更多内容。

答案 2 :(得分:0)

当我的一个仅包含C源文件(* .c)的项目引用包含c ++文件(* .cpp)的另一个项目时,我发现了类似的问题。两个项目的Application.mk文件都包含APP_STL:= gnustl_shared。 ndk版本是ndk7e。

解决方案是将空C ++文件(dummy.cpp)添加到仅包含.c文件的项目中。据说ndk明白这个项目应该与gnustl_shared链接,并且构建成功。