使用预构建的静态库进行Android NDK开发

时间:2011-06-22 07:36:34

标签: android static-libraries android-ndk

我正在尝试构建一个使用来自某些现有c ++代码的静态库的android应用程序。但是我似乎无法建立起来,这是我到目前为止采取的步骤..

我有ndk-r5b,并根据ndk / docs / STANDALINE-TOOLCHAIN.html构建了独立的工具链。然后我使用独立的工具链编译器(arm-linux-androideabi-g ++)代替g ++,用于编译我需要的静态库的Makefile中的CXX标志。这编译没有错误,并产生了3个静态库。 下面是一些用于构建预构建库的标志的代码片段:

CXX = arm-linux-androideabi-g++
SYSTEM_LIBS = -lstdc++ -lm
INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/

以下是编译时从makefile生成的示例行:

arm-linux-androideabi-g++ -c -DTIME_SIM -I./include  -I/home/greg/dev/Android/android-ndk-r5b/platforms/android-8/arch-arm/usr/include/ -fpic -ggdb3 -SimTime.C -o SimTime.o

接下来,我使用ndk-build为Android.mk使用以下内容构建应用程序:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := engine
LOCAL_SRC_FILES := ../libs/libEngine.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := shmem
LOCAL_SRC_FILES := ../libs/libShMem.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := util
LOCAL_SRC_FILES := ../libs/libUtil.a
include $(PREBUILT_STATIC_LIBRARY)

# build server as a shared library
include $(CLEAR_VARS)
LOCAL_MODULE := libServer   
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include 

LOCAL_SRC_FILES := \
    Server.C \
    Router.C \
    RouterMsgs.C \
    Federation.C \
    cripName.C \
    ver.C \
    JNIWrapper.cpp
LOCAL_STATIC_LIBRARIES := engine shmem util
include $(BUILD_SHARED_LIBRARY)

使用android ndk中给出的独立工具链编译器可以很好地编译预构建的库。但是,当使用ndk-build将共享库链接到预构建的库时,有许多未解析的对ostream的引用。例如:

/home/android/obj/local/armeabi/libShMem.a(SubscriptionItem.o): In function `SUBSCRIPTION_ITEM::Print(std::basic_ostream<char, std::char_traits<char> >&)':/home/src/comm/SubscriptionItem.C:97: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'

我假设我在使用独立编译器进行编译时遗漏了一些重要的标记或者没有做正确的事情,但是对此问题的任何帮助或见解都会非常感激,因为我似乎无法在谷歌或任何android ndk文档。谢谢!

2 个答案:

答案 0 :(得分:3)

嗯,您可以通过在Android.mk文件所在的同一文件夹中创建 Application.mk 文件来解决此问题,其中包含:

APP_STL := stlport_static

用于使用位于Android NDK内的静态stlport。

答案 1 :(得分:1)

我遇到了同样的问题,并通过为标准C ++库添加模块来解决它。由ndk-build系统链接的库来自错误的位置(在我的情况下是platforms / android-9 / arch-arm / usr / lib)。

include $(CLEAR_VARS)
LOCAL_MODULE := rightstdc
LOCAL_SRC_FILES := <path to the correct libstdc++.a>
include $(PREBUILT_STATIC_LIBRARY)

将模块标记添加到静态库列表中:

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc

如果在LOCAL_LDLIBS中指定了任何库,build/core/build-binary.mk会预先-L$(SYSROOT)/usr/lib,但在我的情况下,这是错误的路径。

我不知道是否有丢失的步骤应该将正确的libstdc ++复制到该位置,但上述方法将有效。