[英]using pre-built static libraries for Android NDK development
我正在尝试构建一个使用一些现有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*)'
我认为我在使用独立编译器进行编译时会丢失一些重要的标志或未做正确的事情,但是对此问题的任何帮助或见解将不胜感激,因为我似乎无法在Google或任何Android NDK中找到此答案文档。 谢谢!
好的,您可以通过在与Android.mk文件相同的文件夹中创建Application.mk文件来解决此问题,该文件包含:
APP_STL := stlport_static
用于使用位于Android NDK内的静态stlport。
我遇到了同样的问题,并通过为标准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 ++复制到该位置,但是上面的方法会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.