In sum, Android didn’t support libpthreads.so so cannot build AWS IoT mqtt for Android using c++ version(git@github.com:aws/aws-iot-device-sdk-cpp.git)
Android implement the pthread in Bionic http://androidxref.com/7.1.2_r36/xref/bionic/libc/bionic/pthread_attr.cpp#199
or maybe I need to build libpthread for Android myself
below are some thing I did on the way to build cpp version of AWS IoT for Android, just memorize the lost 2 days
I download AOSP source to /mnt/RAID10-Volume/owen/T2/repos
below commands to build a executable binary on Android phone
cp /mnt/RAID10-Volume/owen/AOSP/prebuilts/ndk/current/platforms/android-24/arch-arm64/usr/lib/crtend_android.o . cp /mnt/RAID10-Volume/owen/AOSP/prebuilts/ndk/current/platforms/android-24/arch-arm64/usr/lib/crtbegin_dynamic.o . prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin$ ./aarch64-linux-android-gcc test.c -pie -fPIE -O0 -ggdb3 -fno-inline -g -I. ./../../../../../prebuilts/ndk/current/platforms/android-24/arch-arm64/usr/include/ -L../../../../../../prebuilts/ndk/current/platforms/android-24/arch-arm64/usr/lib/
you can just change the path according to your local path
- git clone git@github.com:aws/aws-iot-device-sdk-cpp.git
- cd aws-iot-device-sdk-cpp
- git checkout -b release origin/release
- vim ToolchainFile.cmake
- +++ b/ToolchainFile.cmake
@@ -6,10 +6,10 @@ SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_VERSION 1)# Specify toolchain directory
-SET(TOOLCHAIN_DIR /home/toolchain/dir/here/bin)
+SET(TOOLCHAIN_DIR /mnt/RAID10-Volume/owen/T2/repos/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin)# Specify cross compilation target
-SET(TARGET_CROSS target-here)
+SET(TARGET_CROSS aarch64-linux-android-)# Set compilers
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/${TARGET_CROSS}g++)
@@ -40,3 +40,17 @@ SET(CMAKE_NM ${TOOLCHAIN_DIR}/${TARGET_CROSS}nm)# Set THREADS_PTHREAD_ARG for testing threading
SET(THREADS_PTHREAD_ARG “2″ CACHE STRING “Forcibly set by ToolchainFile.cmake." FORCE)
+
+SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/${TARGET_CROSS}gcc)
+set(MYSYSROOT /mnt/RAID10-Volume/owen/T2/repos/prebuilts/ndk/current/platforms/android-24/arch-arm64/)
+set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} –sysroot=${MYSYSROOT}" CACHE INTERNAL “" FORCE)
+set(CMAKE_C_FLAGS “${CMAKE_C_FLAGS} –sysroot=${MYSYSROOT}" CACHE INTERNAL “" FORCE)
+set(CMAKE_CXX_LINK_FLAGS “${CMAKE_CXX_LINK_FLAGS} –sysroot=${MYSYSROOT}" CACHE INTERNAL “" FORCE)
+set(CMAKE_C_LINK_FLAGS “-L${MYSYSROOT}/usr/lib –sysroot=${MYSYSROOT}" CACHE INTERNAL “" FORCE)
+# cmake built-in settings to use find_xxx() functions
+set(CMAKE_FIND_ROOT_PATH “${MYSYSROOT}")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+link_directories(${MYSYSROOT}/usr/lib) - vim network/CMakeLists.txt.in
- +++ b/network/CMakeLists.txt.in
@@ -7,7 +7,7 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
message( FATAL_ERROR “In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt and CMakeFiles folder." $
endif()-set(NETWORK_LIBRARY “OpenSSL" CACHE STRING “Network Library to use")
+set(NETWORK_LIBRARY “MbedTLS" CACHE STRING “Network Library to use") - mkdir build
- cd build
- cmake ../. -DCMAKE_TOOLCHAIN_FILE=../ToolchainFile.cmake
- make help; to see what module you can make now
- make pub-sub-sample
- then I meet a lot of reference problem so I change ToolChainFile.cmake again
ToolChainFile.cmake as below
$ git diff diff --git a/ToolchainFile.cmake b/ToolchainFile.cmake index ac8aa2b..9d5a45d 100644 --- a/ToolchainFile.cmake +++ b/ToolchainFile.cmake @@ -6,10 +6,10 @@ SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_SYSTEM_VERSION 1) # Specify toolchain directory -SET(TOOLCHAIN_DIR /home/toolchain/dir/here/bin) +SET(TOOLCHAIN_DIR /mnt/RAID10-Volume/owen/T2/repos/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin) # Specify cross compilation target -SET(TARGET_CROSS target-here) +SET(TARGET_CROSS aarch64-linux-android-) # Set compilers SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/${TARGET_CROSS}g++) @@ -40,3 +40,8 @@ SET(CMAKE_NM ${TOOLCHAIN_DIR}/${TARGET_CROSS}nm) # Set THREADS_PTHREAD_ARG for testing threading SET(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by ToolchainFile.cmake." FORCE) + +set(CMAKE_CXX_LINK_FLAGS "-nostdlib") + +link_directories(/mnt/RAID10-Volume/owen/T2/repos/prebuilts/ndk/current/platforms/android-24/arch-arm64/usr/lib/) +include_directories(/mnt/RAID10-Volume/owen/T2/repos/prebuilts/ndk/current/platforms/android-24/arch-arm64/usr/include/) diff --git a/network/CMakeLists.txt.in b/network/CMakeLists.txt.in index 7e44bc4..9b8275f 100644 --- a/network/CMakeLists.txt.in +++ b/network/CMakeLists.txt.in @@ -7,7 +7,7 @@ if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) message( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt and CMakeFiles folder." ) endif() -set(NETWORK_LIBRARY "OpenSSL" CACHE STRING "Network Library to use") +set(NETWORK_LIBRARY "MbedTLS" CACHE STRING "Network Library to use") set_property(CACHE NETWORK_LIBRARY PROPERTY STRINGS OpenSSL MbedTLS WebSocket) #########################
and got build message as below
$ cmake ../. -DCMAKE_TOOLCHAIN_FILE=../ToolchainFile.cmake -- The CXX compiler identification is GNU 4.9.0 -- Check for working CXX compiler: /mnt/RAID10-Volume/owen/T2/repos/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-g++ -- Check for working CXX compiler: /mnt/RAID10-Volume/owen/T2/repos/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-g++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /mnt/RAID10-Volume/owen/D2/aws-iot-device-sdk-cpp/build/third_party/rapidjson/download Scanning dependencies of target rapidjson [ 11%] Creating directories for 'rapidjson' [ 22%] Performing download step for 'rapidjson' Cloning into '.'... [ 33%] No patch step for 'rapidjson' [ 44%] No update step for 'rapidjson' [ 55%] No configure step for 'rapidjson' [ 66%] No build step for 'rapidjson' [ 77%] No install step for 'rapidjson' [ 88%] No test step for 'rapidjson' [100%] Completed 'rapidjson' [100%] Built target rapidjson -- Looking for C++ include pthread.h -- Looking for C++ include pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - not found -- Check if compiler accepts -pthread -- Check if compiler accepts -pthread - no CMake Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message): Could NOT find Threads (missing: Threads_FOUND) Call Stack (most recent call first): /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE) /usr/share/cmake-3.5/Modules/FindThreads.cmake:223 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) CMakeLists.txt:85 (find_package) -- Configuring incomplete, errors occurred! See also "/home/owen/disk2/D2/aws-iot-device-sdk-cpp/build/CMakeFiles/CMakeOutput.log". See also "/home/owen/disk2/D2/aws-iot-device-sdk-cpp/build/CMakeFiles/CMakeError.log".
it need -pthread but Android has no such lib