cross compile AWS IOT mqtt program for Android using AOSP

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

  1. git clone git@github.com:aws/aws-iot-device-sdk-cpp.git
  2. cd aws-iot-device-sdk-cpp
  3. git checkout -b release origin/release
  4. vim ToolchainFile.cmake
  5. +++ 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)
  6. vim network/CMakeLists.txt.in
  7. +++ 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")
  8. mkdir build
  9. cd build
  10. cmake ../. -DCMAKE_TOOLCHAIN_FILE=../ToolchainFile.cmake
  11. make help; to see what module you can make now
  12. make pub-sub-sample
  13. 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