个人查资料,看到的关于PCL在安卓端使用,是需要重新编译的,,,,,
编译方式详见:https://github.com/bashbug/pcl-for-android
Bash scripts for cross compiling PCL ( https://github.com/PointCloudLibrary/pcl ) and its dependencies for Android.Scripts were tested for
Ubuntu
$ sudo apt-get install git make cmake
Fedora
$ sudo dnf install git make cmake
$ git clone https://github.com/bashbug/pcl-for-android.git
$ export ANDROID_NDK=PATH_TO_YOUR_LOCAL_ANDROID_NDK_FOLDER
$ ./download-setup.sh
$ ./pcl-build-for-android.sh
The compilations within the pcl-build-for-android.sh needs at least 4GB RAM + 4 GB Swap or 8GB RAM.
Default uses for make -j the number of CPUs.
The number of CPUs and thereby the memory usage can be reduced by setting the option as follows.
$ jobs=NUM_OF_CPUS ./pcl-build-for-android.sh
This script downloads the dependencies:
This script cross compiles FLANN, BOOST and PCL for android. Add the following folders to your Android.mk file:
//编译大概就是这样,后面怎么在Android Studio 中gradle和Cmakelists中写依赖的话,容我在琢磨琢磨,后续再更新
生成文件导入到Android Studio工程中的步骤如下
一. gradle修改
经过查看代码和测试,上面的方法交叉编译对应的是armeabi-v7a和armeabi,如果有别的需求或者代码能力可以的话,可以自己修改android.toolschain.cmake文件,改成别的也行,我这里没太大要求,所以就用armeabi-v7a。
所以在gradle中需要指定对应的环境,不要全部都包含了。由于大多数安卓机都支持armeabi-v7a,所以我的方式为:
defaultConfig{
ndk{
abiFilters 'armeabi-v7a'//, 'x86', 'arm64-v8a', 'x86_64' 最好指定特定的一个平台
}
externalNativeBuild{
cmake{
arguments '-DANDROID_TOOLCHAIN=gcc',//clang没有试过,不知道可以不可以,这里gcc是可行的
'-DANDROID_STL=gnustl_static'
}
}
}
如果不改变的话,容易出现 “incompatible target”的error.,个人认为这个错误大多是编译安卓版本时对应的平台不一致导致。
其次,最好在src/main文件夹下新建lib/armeabi-v7a文件夹,然后把.so和.a文件都copy过来,这样的原因:
1. 算是一种代码规范吧。。其实要说规范的话,头文件也最好放在include文件夹下。。。
2. 似乎这样子操作的话,是告诉安卓,我用的就是armeabi-v7a,你别给我瞎比编译成别的环境了。。。嗯好像是这样,有兴趣的同学可以查查,然后告诉我
二. 然后是CMakeLists中的修改。
1). 添加头文件。
include_directories( src/main/cpp/include/pclcpp)//路径按照自己的来
2). 指定链接库的位置
add_library(pclcpp STATIC IMPORTED)
set_target_properties(pclcpp
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpclcpp.a)
3). 连接到主工程中
target_link_libraries(native-lib
pclcpp
${log-lib})
如果在build时报错error: xxx.so,needed by xxxx.so,missing and no known rule to make it
这个直白点就是说,你的xxx.so没找到。八成是路径写错了
嗯目前就遇到了这些坑,如果还有别的再继续写了~欢迎留言讨论。
转载请注明原处,谢谢
自用的小坑解决方案备忘录(针对我自己的工程):
1.在include的时候,头文件可以不放在android studio,在cmakelists中写好路径就可以了
2.point cloud trianglation时,就是pcl上greedy的那个算法,在target_link_libraries时,最好将pcl_common放在pcl_search后面,不然容易报错,提示undefined refence to pcl::getCameraMatrixFromProjectionMatrix
3.如果编译时出现std::ofstream之类的错误,在gradle中改为“-DANDROID_STL=gnustl_static”