相关疑难解决方法(0)

如何将boost库(包括shared_ptr)与Android NDK和STLport一起使用

这更像是一个答案,而不是一个问题,因为我已经弄明白了,至少就干净地编译图书馆而言.对我来说,主要问题是让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的任何地方都包含标题.编译源代码并将其添加到库中.

c++ boost stlport android-ndk

57
推荐指数
1
解决办法
2万
查看次数

Android NDK:包括boost c ++库

我正在尝试使用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)

android boost makefile android-ndk

24
推荐指数
2
解决办法
3万
查看次数

在android中包含Boost C++库

我一直试图在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.aboost_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)

c++ java-native-interface android boost

21
推荐指数
1
解决办法
1万
查看次数

Android NDK R5和支持C++异常

我正在尝试使用NDK 5完整的C++ gnustl:

CPLUSPLUS-SUPPORT.html状态:

NDK工具链支持C++异常,因为NDK r5,但是出于与先前版本的兼容性原因,默认情况下所有C++源都使用-fno-exceptions支持进行编译.

要启用它,请使用'-fexceptions'C++编译器标志.这可以通过将以下内容添加到Android.mk中的每个模块定义来完成:

LOCAL_CPPFLAGS += -fexceptions
Run Code Online (Sandbox Code Playgroud)

更简单地说,在Application.mk中添加一行,该设置将自动应用于所有项目的NDK模块:

APP_CPPFLAGS += -fexceptions
Run Code Online (Sandbox Code Playgroud)

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)

就是我失去了一些东西或者是在陈述READMECPLUSPLUS-SUPPORT.html只是简单的错误?

c++ exception android-ndk

13
推荐指数
2
解决办法
2万
查看次数

谁使用Boost ASIO?

我想知道Boost ASIO有多受欢迎.它是否被用于任何流行的网络密集型软件?

boost-asio

10
推荐指数
2
解决办法
4283
查看次数

我应该在Android中选择Boost Asio还是Aysnc Socket线程?

我正在为Android开发基于网络的UI应用程序,它将执行以下类型的功能

  1. 需要与基于n/w的嵌入式设备上运行的TCP服务器通信(一次> 100).
  2. 定期轮询这些设备以获取更新的信息
  3. 从这些设备发送和接收信息
  4. 以上所有信息都将由应用程序的UI控制和管理

考虑到上述情况,应用程序可能必须为多个连接生成多个线程并管理它们.所以我的查询是

  1. 使用Boost.Asio库开发网络模块是一种好方法吗?或者可以打开多达100个套接字线程进行连接?

  2. 如果使用Boost.Asio,那么将使用NDK单独开发网络模块,访问JNI会到位,这反过来会导致响应缓慢?

或者,还有其他更好的选择吗?期待您的投入!

提前谢谢了.

sockets boost-asio android-networking android-asynctask

5
推荐指数
1
解决办法
1463
查看次数