这更像是一个答案,而不是一个问题,因为我已经弄明白了,至少就干净地编译图书馆而言.对我来说,主要问题是让shared_ptr工作.
配料:
Boost v.1.45.0
STLport的版本位于http://www.anddev.org/viewtopic.php?p=29939.
NDK的版本r4b.
路线:
在你的Android.mk文件中添加:
LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC
Run Code Online (Sandbox Code Playgroud)
在stlport/stl/_string.h的第613行删除对__stl_throw_length_error的调用.如果您愿意,可以使用_STLP_NO_EXCEPTIONS.
在第261行之后编辑boost/boost/smart_ptr/shared_ptr.hpp以消除对shared_ptr构造函数中对boost :: throw_exception的调用.我在方法的整个主体周围使用了#ifndef BOOST_EXCEPTION_DISABLE.(但请参阅下面的答案.)
接下来你需要提供一些缺失的部分.使用以下内容创建头文件:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
struct bad_alloc : public exception { bad_alloc operator()(){}};
}
#endif
Run Code Online (Sandbox Code Playgroud)
和一个带有精简异常类的源文件,以支持bad_alloc:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
exception::exception() {}
exception::~exception() {}
const char* exception::what() const {}
}
#endif
Run Code Online (Sandbox Code Playgroud)
在包含boost/shared_ptr.hpp的任何地方都包含标题.编译源代码并将其添加到库中.
我正在尝试使用NDK在我的Android应用程序中使用boost库.我在这里和这里找到了几个成功案例,但我不能对我说同样的话.我特意尝试在此链接中使用库,以及boost线程库.在下面的代码中,我只是尝试包含线程库,而不是数学库.我用来构建boost库的过程与我附加的第一个链接几乎相同.
到目前为止,似乎我已经成功构建了boost库,但是当我运行时ndk-build,我收到以下错误:
Prebuilt : libboost_thread.a <= <NDK>/sources/
cp: omitting directory `path/to/ndk/sources/boost'
make: *** [obj/local/armeabi/libboost_thread.a] Error 1
Run Code Online (Sandbox Code Playgroud)
显然这cp: omitting directory...不是一个错误.但我唯一能得到的就是下一行,这并不是什么意思.Error 1
这是我的Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := boost_thread
LOCAL_LDLIBS := lboost_system-gcc-md lboost_thread-gcc-md -lgnustl_static
LOCAL_LDLIBS += lboost_system-gcc-md lboost_thread-gcc-md \
-L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \
-lgnustl_static
LOCAL_SRC_FILES := #cpp_sources
LOCAL_MODULE := com_example_ndkFile_CppMethods
include $(BUILD_SHARED_LIBRARY)
$(call import-module,boost)
Run Code Online (Sandbox Code Playgroud)
并且还有一个Android.mk文件path/to/ndk/sources/boost/:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= boost_thread
LOCAL_SRC_FILES:= android/lib/libboost_thread.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include …Run Code Online (Sandbox Code Playgroud) 我一直试图在Windows上与Boost和android结婚很长时间并尝试了很多方法,但仍然没有运气.我想在android中使用Boost库制作一个示例程序.我在这里关注本教程.
正如本教程建议我将我的Boost lib保存在****(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)
Run Code Online (Sandbox Code Playgroud)
现在,下一步是在我的项目目录中,在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)
Run Code Online (Sandbox Code Playgroud)
这是放在jni文件夹内的同一位置的Application.mk文件.Application.mk文件的内容如下:
APP_STL …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用NDK 5完整的C++ gnustl:
的CPLUSPLUS-SUPPORT.html状态:
NDK工具链支持C++异常,因为NDK r5,但是出于与先前版本的兼容性原因,默认情况下所有C++源都使用-fno-exceptions支持进行编译.
要启用它,请使用'-fexceptions'C++编译器标志.这可以通过将以下内容添加到Android.mk中的每个模块定义来完成:
Run Code Online (Sandbox Code Playgroud)LOCAL_CPPFLAGS += -fexceptions更简单地说,在Application.mk中添加一行,该设置将自动应用于所有项目的NDK模块:
Run Code Online (Sandbox Code Playgroud)APP_CPPFLAGS += -fexceptions
sources/cxx-stl/gnu-libstdc++/README 状态:
该目录包含GNU libstdc ++ - v3 C++标准模板库实现的头文件和预构建二进制文件.
这些是通过build/tools下的rebuild-all-prebuilt.sh脚本从工具链源生成的.
要使用它,请在Application.mk中将APP_STL定义为'gnustl_static'.有关详细信息,请参阅docs/CPLUSPLUS-SUPPORT.html.
此实现完全支持C++异常和RTTI.
但所有使用异常的尝试都失败了 另一种NDK存在于http://www.crystax.net/android/ndk-r4.php上.使用该NDK中的hello-jni示例不起作用.创建一个Application.xmlwith 后,NDK 5的编译工作正常
APP_STL := gnustl_static
Run Code Online (Sandbox Code Playgroud)
将APP_STL设置为gnustl_static也自动启用-frtti和-fexceptions.但它死于与我自己的实验相同的可怕死亡.
我已经设法得到一个崩溃的代码的最小例子:
try {
__android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!");
throw "Wrong object type.";
} catch (char* b) {
__android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!");
}
Run Code Online (Sandbox Code Playgroud)
就是我失去了一些东西或者是在陈述README和CPLUSPLUS-SUPPORT.html只是简单的错误?
我正在为Android开发基于网络的UI应用程序,它将执行以下类型的功能
考虑到上述情况,应用程序可能必须为多个连接生成多个线程并管理它们.所以我的查询是
使用Boost.Asio库开发网络模块是一种好方法吗?或者可以打开多达100个套接字线程进行连接?
如果使用Boost.Asio,那么将使用NDK单独开发网络模块,访问JNI会到位,这反过来会导致响应缓慢?
或者,还有其他更好的选择吗?期待您的投入!
提前谢谢了.
android-ndk ×3
boost ×3
c++ ×3
android ×2
boost-asio ×2
exception ×1
makefile ×1
sockets ×1
stlport ×1