Как построить PCL для разных ABI - PullRequest
0 голосов
/ 07 июля 2019

Я успешно построил библиотеку Point Cloud с супербилдом из https://github.com/bashbug/pcl-for-android

В результате сборки был получен PCL для armeabi-v7a ABI.Как построить для других ABI?

Я пытался изменить скрипт pcl-build-for-android.sh, но не повезло.Я изменил первую строку в скрипте:

#!/bin/bash

# specify the arm as abi, the api level for android kitkat as used by
# google tango and with gnustl_static the c++ support
# for more information look into the android.toolchain.cmake file
export ANDROID_ABI="arm64-v8a"
export ANDROID_NATIVE_API_LEVEL=android-19
export ANDROID_STL=gnustl_static
export ANDROID_STL_FORCE_FEATURES=ON
...

Но каждый раз, когда он строит версию по умолчанию armeabi-v7a.Я пытался очистить и восстановить несколько раз.

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Этот скрипт сборки не работает с современным NDK, но его можно сделать несколько проще (патч ниже).При этом я вижу, что он строит для arm64, поэтому, вероятно, ваша проблема - ошибка в их старом файле cmake toolchain (для перехода на современный NDK требуется перейти на тот, который предоставляется NDK, а не на тот репозиторий, который работает).

К сожалению, существует ряд других проблем с хранилищем (в коде есть некоторые тонкие ошибки, которые не видны на всех платформах / компиляторах, но отображаются при сборке для Android).Они кажутся в значительной степени тривиальными исправлениями.

diff --git a/pcl-build-for-android.sh b/pcl-build-for-android.sh
index f4f1a70..da6ac84 100755
--- a/pcl-build-for-android.sh
+++ b/pcl-build-for-android.sh
@@ -3,12 +3,11 @@
 # specify the arm as abi, the api level for android kitkat as used by
 # google tango and with gnustl_static the c++ support
 # for more information look into the android.toolchain.cmake file
-export ANDROID_ABI="armeabi armeabi-v7a with NEON"
-export ANDROID_NATIVE_API_LEVEL=android-19
-export ANDROID_STL=gnustl_static
-export ANDROID_STL_FORCE_FEATURES=ON
+ANDROID_ABI="arm64-v8a"
+MIN_SDK_VERSION=19
+ANDROID_STL=c++_static

-export CFLAGS="-pipe -w"
+export CFLAGS="-w"
 export CXXFLAGS=${CFLAGS}

 [[ -z "${jobs}" ]] && jobs=$(grep -cP '^processor' /proc/cpuinfo)
@@ -25,7 +24,7 @@ fi
 cd build

 ROOT=${PWD}
-ANDROIDTOOLCHAIN=${ROOT}/../android.toolchain.cmake
+ANDROIDTOOLCHAIN=${ANDROID_NDK}/build/cmake/android.toolchain.cmake

 EIGEN_INCLUDE_DIR=${ROOT}/eigen # eigen needs no cross-compiling
 FLANN_ROOT=${ROOT}/flann
@@ -42,10 +41,23 @@ cmake . -DCMAKE_BUILD_TYPE:STRING=Release \
   -DCMAKE_TOOLCHAIN_FILE:FILEPATH=$ANDROIDTOOLCHAIN \
   -DBUILD_EXAMPLES:BOOL=OFF \
   -DBUILD_PYTHON_BINDINGS:BOOL=OFF \
-  -DBUILD_MATLAB_BINDINGS:BOOL=OFF
+  -DBUILD_MATLAB_BINDINGS:BOOL=OFF \
+  -DANDROID_ABI=$ANDROID_ABI \
+  -DANDROID_PLATFORM=android-$MIN_SDK_VERSION \
+  -DANDROID_STL=$ANDROID_STL \
+
+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi

 make -j${jobs}

+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi
+
 cd ..
 echo "FLANN cross-compiling finished!"

@@ -72,10 +84,23 @@ cd ${BOOST_ROOT}

 cmake . -DCMAKE_BUILD_TYPE:STRING=Release \
   -DCMAKE_TOOLCHAIN_FILE:FILEPATH=$ANDROIDTOOLCHAIN \
-  -DBUILD_SHARED_LIBS:BOOL=OFF
+  -DBUILD_SHARED_LIBS:BOOL=OFF \
+  -DANDROID_ABI=$ANDROID_ABI \
+  -DANDROID_PLATFORM=android-$MIN_SDK_VERSION \
+  -DANDROID_STL=$ANDROID_STL \
+
+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi

 make -j${jobs}

+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi
+
 cd ..
 echo "BOOST cross-compiling finished!"

@@ -139,13 +164,22 @@ function cmake_pcl {
     -DBoost_THREAD_LIBRARY=${Boost_LIBRARIES}/libboost_thread.a \
     -DBoost_THREAD_LIBRARY_DEBUGBoost_INCLUDE_DIRS=${Boost_LIBRARIES}/libboost_thread.a \
     -DBoost_THREAD_LIBRARY_RELEASE=${Boost_LIBRARIES}/libboost_thread.a \
-    -DBoost_LIBRARY_DIRS=${Boost_LIBRARIES}
+    -DBoost_LIBRARY_DIRS=${Boost_LIBRARIES} \
+    -DANDROID_ABI=$ANDROID_ABI \
+    -DANDROID_PLATFORM=android-$MIN_SDK_VERSION \
+    -DANDROID_STL=$ANDROID_STL \
+
 }

 ### pcl cmake files do not set library paths properly. Therefore cmake has to be run twice.
 cmake_pcl
 cmake_pcl

+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi
+
 echo -e "\n\n\033[1;32m make -j$jobs\033[m\n"
 echo -e "\n\n\033[1;32m this will run for a while... time to drink a\n"
 echo -e "   ( ( "
@@ -157,9 +191,19 @@ echo -e "   '----' \033[m\n\n"

 make -j${jobs}

+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi
+

 echo -e "\n\n\033[1;35m make install\033[m\n\n"
 make install

+if [ $? -ne 0 ]; then
+  echo >&2 Build failed
+  exit 1
+fi
+
 cd ..
 echo "PCL cross-compiling finished!"
0 голосов
/ 08 июля 2019

Попробуйте изменить уровень API на 21, например

export ANDROID_NATIVE_API_LEVEL=android-21

Потому что, начиная с API 21, Android поддерживает 64-битный ABI.

...