安卓使用记录笔记(4)Android studio 使用PCL库

个人查资料,看到的关于PCL在安卓端使用,是需要重新编译的,,,,,

编译方式详见:https://github.com/bashbug/pcl-for-android

pcl-for-android

Bash scripts for cross compiling PCL ( https://github.com/PointCloudLibrary/pcl ) and its dependencies for Android.Scripts were tested for

  • Fedora 23, 24  (这个是干嘛的。。我到现在也没搞清)
  • Ubuntu 16.04
  • Android NDK 10e, 11c, 12b(原链接中是这么写的,我在编译的时候使用的是14b)

Install Requirements

Ubuntu

$ sudo apt-get install git make cmake

Fedora

$ sudo dnf install git make cmake

Cross-compilation

$ 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

download-setup.sh

This script downloads the dependencies:

  • EIGEN 3.2.9
  • FLANN 1.8.4
  • BOOST 1.61.0
  • PCL 1.8

pcl-build-for-android.sh

This script cross compiles FLANN, BOOST and PCL for android. Add the following folders to your Android.mk file:

  • eigen
  • flann-android
  • boost-android
  • pcl-android

//编译大概就是这样,后面怎么在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”

猜你喜欢

转载自blog.csdn.net/hehehetanchaow/article/details/81033791
今日推荐