0

我一直在尝试按照以下说明将 boost 链接到我的 android 应用程序中:

在 android 中包含 Boost C++ 库

这似乎非常简洁和明智。不幸的是,经过几天的尝试,我看不出我做错了什么,因为最终结果是 ndk-build 关于我尝试包含的 boost 标头返回“没有这样的文件或目录”。

在构建了我需要的 boost 库之后,我将它们复制到 proj.android/jni/boost/include 和 proj.android/jni/boost/lib 中。然后我在 jni 中创建了一个名为 boost-build 的目录,我在其中创建了一个 Android.mk 来处理定义模块以链接到 libboost_serialization 静态库(这是我唯一感兴趣的 boost 库)。

LOCAL_PATH:= $(call my-dir)

# serialization
include $(CLEAR_VARS)

# I'm not sure this is necessary / helpful, but I've tried without it, as well
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include/boost-1_49 \
# EDIT: replaced previous line from this, at Igor's correction: $(LOCAL_PATH)/../include/boost-1_49/boost \
                    $(LOCAL_PATH)/../include/boost-1_49/boost/archive \
                    $(LOCAL_PATH)/../include/boost-1_49/boost/serialization

LOCAL_MODULE:= boost_serialization
LOCAL_SRC_FILES:= ../lib/libboost_serialization-gcc-mt-1_49.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/boost-build-includes
include $(PREBUILT_STATIC_LIBRARY)

android项目makefile,proj.android/jni/Android.m:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LDFLAGS= -L$(NDK_ROOT)/sources/crystax/libs/armeabi-v7a/4.6.3 -Lcrystax 

LOCAL_CPPFLAGS += -fexceptions 

LOCAL_CPPFLAGS += -frtti

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp \
        ../../Classes/TitleScene.cpp \
        ../../Classes/GameSettings.cpp \
        ../../Classes/Cutscene.cpp \
        ../../Classes/HighScoreTable.cpp \
        ../../Classes/MaskNode.cpp \
        ../../Classes/MenuResponder.cpp \
        ../../Classes/HudElementBg.cpp \
        ../../Classes/OHRCharSelectMenu.cpp \
        ../../Classes/OHRDifficultySelectMenu.cpp \
        ../../Classes/Types.cpp \
        ../../Classes/OHRMainMenu.cpp

# I've tried with / without this variable, as well, with the same result
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../include/boost-1_49 \
# EDIT: replaced previous line from this, at Igor's correction: $(LOCAL_PATH)/../include/boost-1_49/boost \
        $(LOCAL_PATH)/../boost/include/boost-1_49/boost/archive \
        $(LOCAL_PATH)/../boost/include/boost-1_49/boost/serialization

LOCAL_WHOLE_STATIC_LIBRARIES := boost_serialization cocos2dx_static cocosdenshion_static cocos_extension_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android) \
$(call import-module,boost-build) \
$(call import-module,cocos2dx)

现在,当我运行 ndk-build 编译源代码时,我收到以下错误:

Compile++ thumb  : game_shared <= main.cpp
Compile++ thumb  : game_shared <= AppDelegate.cpp
In file included from jni/../../Classes/MapUtils.h:2:0,
                 from jni/../../Classes/Types.h:3,
                 from jni/../../Classes/menuresponder.h:2,
                 from jni/../../Classes/OHRMainMenu.h:2,
                 from jni/../../Classes/TitleScene.h:10,
                 from jni/../../Classes/AppDelegate.cpp:6:

jni/../../Classes/BoostUtils.h:2:36: fatal error: boost/archive/tmpdir.hpp: No such file or directory

(BoostUtils.h 是一个只包含一堆与序列化相关的头文件的头文件)

#include <boost/archive/tmpdir.hpp>

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/assume_abstract.hpp>

现在,今晚恰好一次,运行它会生成一堆 .so 和 .a,包括 libbost_serialization.so,在 proj.android/obj/local 中。尽管删除了 /obj 目录,但我一直无法生成它。同样奇怪的是,尽管本文顶部的链接提出了建议,但在运行 ndk-build 时并未创建 /libs 目录。但是,我不能 100% 确定 .so 甚至需要生成。

因此,对于我的生活,我无法确定这里的问题。任何解决方案或方向将不胜感激。

4

1 回答 1

1

经验教训:LOCAL_C_INCLUDES 实际上是一个必要的变量,并确保它指向正确的位置。在我的情况下,它只是一个错误的 '../' 并包含 'boost/' 的内容,而不是包含 boost 的目录。

(另外,多睡觉,而不是花几个小时浏览这些问题。)

于 2013-01-16T16:51:43.600 回答