2014-02-11 41 views
3

我想在Android上使用NDK 9C构建Boost 1.55 Log v2库。 我已经使用了补丁,并使用build-android.sh构建boost,包括线程,iostreams,随机和日志选项。 我已经使用了Boost的其他功能,他们已经工作。但似乎存在与Log V2的链接问题,我无法用现有的解决方案解决这个问题。我不断收到“未定义的参考”错误。 在网络上,人们解决了这个问题,其中包括“#define BOOST_ALL_DYN_LINK”,但它对我无效。你有什么想法可能是什么问题?提前致谢。升压日志V2库Android连接

控制台输出:

10:35:45 **** Build of configuration Default for project BoostLogLib **** 
/home/guven/Desktop/IDP/adt/android-ndk-r9c/ndk-build all 
Android NDK: WARNING: APP_PLATFORM android-9 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml  
Android NDK: WARNING:jni/Android.mk:BoostLogLib: non-system libraries in linker flags: /home/guven/Desktop/IDP/adt/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a -lboost_system-gcc-mt-1_55 -lboost_filesystem-gcc-mt-1_55 -lboost_thread-gcc-mt-1_55 -lboost_iostreams-gcc-mt-1_55 -lboost_date_time-gcc-mt-1_55 -lboost_random-gcc-mt-1_55 -lboost_log-gcc-mt-1_55 -lboost_log_setup-gcc-mt-1_55 -lboost_program_options-gcc-mt-1_55 -lboost_regex-gcc-mt-1_55 -lboost_chrono-gcc-mt-1_55  
Android NDK:  This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES  
Android NDK:  or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the  
Android NDK:  current module  
[armeabi-v7a] Compile++ thumb: BoostLogLib <= BoostLogLib.cpp 
[armeabi-v7a] SharedLibrary : libBoostLogLib.so 
jni/BoostLogLib.cpp:20: error: undefined reference to 'boost::log::v2_mt_posix::core::get()' 
/home/guven/Desktop/IDP/workspace/3rdparty/Boost-for-Android/boost_1_55_0/boost/log/attributes/attribute_name.hpp:80: error: undefined reference to 'boost::log::v2_mt_posix::attribute_name::get_id_from_string(char const*)' 
jni/BoostLogLib.cpp:20: error: undefined reference to 'boost::log::v2_mt_posix::core::set_filter(boost::log::v2_mt_posix::filter const&)' 
/home/guven/Desktop/IDP/workspace/3rdparty/Boost-for-Android/boost_1_55_0/boost/log/attributes/value_extraction.hpp:232: error: undefined reference to 'boost::log::v2_mt_posix::attribute_value_set::find(boost::log::v2_mt_posix::attribute_name) const' 
/home/guven/Desktop/IDP/workspace/3rdparty/Boost-for-Android/boost_1_55_0/boost/log/attributes/value_extraction.hpp:233: error: undefined reference to 'boost::log::v2_mt_posix::attribute_value_set::end() const' 
/home/guven/Desktop/IDP/workspace/3rdparty/Boost-for-Android/boost_1_55_0/boost/log/attributes/value_extraction.hpp:241: error: undefined reference to 'boost::log::v2_mt_posix::aux::attach_attribute_name_info(boost::exception&, boost::log::v2_mt_posix::attribute_name const&)' 
collect2: error: ld returned 1 exit status 
make: *** [obj/local/armeabi-v7a/libBoostLogLib.so] Error 1 

10:35:50 Build Finished (took 4s.138ms) 

样品的 “HelloWorld” 项目如下代码。 BoostLogLib.h文件

#ifndef BOOSTLOGLIB_H_ 
#define BOOSTLOGLIB_H_ 

#include <jni.h> 

#include <iostream> 

#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  HelloWorld 
* Method: print 
* Signature:()V 
*/ 
JNIEXPORT jstring JNICALL Java_com_example_boostloglib_BoostLogLib_print 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 

#endif /* BOOSTLOGLIB_H_ */ 

BoostLogLib.cpp文件

#define BOOST_LOG_USE_CHAR 
#define BOOST_ALL_DYN_LINK 

#include "BoostLogLib.h" 


#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 

namespace logging = boost::log; 

//[ example_tutorial_trivial_with_filtering 
void init() 
{ 
    logging::core::get()->set_filter 
    (
     logging::trivial::severity >= logging::trivial::info 
    ); 
} 

int start_logging() 
{ 
    init(); 

    return 0; 
} 

JNIEXPORT jstring JNICALL Java_com_example_boostloglib_BoostLogLib_print(JNIEnv * env, jobject obj){ 

    start_logging(); 
    jstring result = env->NewStringUTF("Hello world!!!"); // C style string to Java String 
    return result; 
} 

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := BoostLogLib 
LOCAL_SRC_FILES := BoostLogLib.cpp 
LOCAL_CPP_EXTENSION := .cpp 

LOCAL_CPPFLAGS += -std=c++0x 

LOCAL_LDLIBS += $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/libgnustl_static.a 

LOCAL_CFLAGS += -lpthread 
LOCAL_CFLAGS += -I$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.8/include 
LOCAL_CFLAGS += -I$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include 

LOCAL_CFLAGS += -I/home/guven/Desktop/IDP/workspace/3rdparty/Boost-for-Android/boost_1_55_0 
LOCAL_LDLIBS += -L/home/guven/Desktop/IDP/workspace/3rdparty/Boost-for-Android/build/lib -lboost_system-gcc-mt-1_55 -lboost_filesystem-gcc-mt-1_55 -lboost_thread-gcc-mt-1_55 -lboost_iostreams-gcc-mt-1_55 -lboost_date_time-gcc-mt-1_55 -lboost_random-gcc-mt-1_55 -lboost_log-gcc-mt-1_55 -lboost_log_setup-gcc-mt-1_55 -lboost_program_options-gcc-mt-1_55 -lboost_regex-gcc-mt-1_55 -lboost_chrono-gcc-mt-1_55 

LOCAL_CPPFLAGS += -fexceptions 
LOCAL_CPPFLAGS += -frtti 

include $(BUILD_SHARED_LIBRARY) 

Application.mk

APP_MODULES := BoostLogLib 
APP_ABI := armeabi-v7a 
APP_STL := gnustl_static 
APP_PLATFORM := android-9 
NDK_TOOLCHAIN_VERSION := 4.8 
APP_CPPFLAGS += -std=c++0x 

回答

0

似乎引起问题因为静态库链接 的问题是,它看起来像这样的符号:

boost::log::v2_mt_posix::core::set_filter 

但并不是库具有符号:

boost::log::v2s_mt_posix::core::set_filter 

如果的#define BOOST_ALL_DYN_LINK被删除,APP_STL在应用改变。 mk从gnustl_static到gnustl_shared。然后问题消失。但它不应该以这种方式。

注意如果库建立如下

./build-android.sh --boost=1.55.0 --with-libraries=date_time,filesystem,program_options,regex,signals,system,thread,iostreams,random,log,serialization,graph $PATH_TO_NDK 
,它仅适用