将Boost C++库包含到Android中

22

我已经尝试了很长时间将Boost和Android在Windows上结合起来,尝试了很多方法但仍然没有成功。我想使用Boost库在Android上制作一个示例程序。我正在按照这里的教程进行操作。

如此教程建议的那样,我将我的Boost库保留在****(Android NDK)\sources\boost_1_44_0****,并且成功地编译了它。

然后我在sources/boost_1_44_0内创建了一个Android.mk文件,并输入我想要使用的每个库的条目。在这种情况下,lib文件是libboost_date_time-gcc-mt-s-1_44.a,位于boost_1_44_0/android/lib/中。
以下是Android.mk文件的内容。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= boost_date
LOCAL_SRC_FILES:= boost_1_44_0/android/lib/libboost_date_time-gcc-mt-s-1_44.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_STATIC_LIBRARY) 

现在的下一步是在我的项目目录中,jni文件夹内创建一个 Android.mk 文件(用于创建共享库)。以下是其内容。

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

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_LDLIBS := -llog -ldl
LOCAL_MODULE    := ndkfoo
LOCAL_SRC_FILES := ndkfoo.cpp
LOCAL_STATIC_LIBRARIES := boost_date
include $(BUILD_SHARED_LIBRARY)
$(call import-module,boost_1_44_0) 

这是位于同一位置(jni文件夹内)的Application.mk文件。Application.mk文件的内容如下:

APP_STL      = gnustl_static #(or APP_STL = stlport_static as required)
APP_CPPFLAGS = -fexceptions  

最后,这是我的ndkfoo.cpp文件。

#include <string.h>
#include <jni.h>
#include <stdio.h>
#include <boost/date_time.hpp>

using namespace boost::gregorian;

void Java_com_ndkfoo_NdkfooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
    date weekstart(2002,Feb,1);

}

这个程序可能是错误的,问题在于它无法识别任何boost头文件或函数,并且我总是得到编译错误。

我是否漏掉了什么或者做错了什么?非常感谢任何帮助。

编辑:这个问题包含你需要在Android中引入Boost库的所有内容。有关更多提示,请查看下面我的答案。希望这对你也有用。

谢谢。


1
首先,你的路径略有不同:在教程中,作者提取到了 $ANDROID_NDK/sources/boost。不确定这是否有所不同。作者对库的路径以 android/.. 开始,而你的路径以 boost_1_44_0/android/.. 开始。我建议你先尝试完全按照教程操作,看看是否能解决你的问题。 - Ralf
1
你尝试过使用“ndk-build V=1”来查看是否包含正确吗?那个日志可能会给我们更多的线索。 - javier-sanz
@N-JOY 是的,我成功编译了bjam。但是当我尝试编译boost库时,它在模块路径中给出了未知错误。 - Tae-Sung Shin
我正在尝试解决与该问题相同的问题。似乎他们如何解决这个问题已经在“在聊天中继续此讨论”的链接中丢失了。请问有人能够解释一下如何在Android中使用boost吗?我在包含<boost/*.h>时遇到了问题。请帮忙。 - display name
也请尝试并查看答案中提到的建议。 - N-JOY
显示剩余10条评论
1个回答

5

我的问题几乎包含了在Android中包含BOOST库的完整步骤。但是,在使用过程中,仍然有一些重要的事项需要记住。

  • 每次编译本机代码之前,请删除自动生成的objlib文件夹。

  • 如果您要编写C++本机代码,请将LOCAL_CPP_EXTENSION := .cpp添加到您的Android.mk(jni/Android.mk)文件中。

  • 如果您要编写C++代码,请将所有cpp代码放在extern "C" {}中。

    extern C { /*cpp code*/ }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接