【问题标题】:ISSUE: Running PCL Library with Android ProjectISSUE: 使用 Android 项目运行 PCL 库
【发布时间】:2016-05-31 04:22:49
【问题描述】:

我已经按照这些链接的描述编译了 PCL-SuperBuild 文件夹:

链接 1:https://hcteq.wordpress.com/2014/07/14/compiling-pcl-for-android-in-windows-cmake-gui/# 链接2:http://www.hirotakaster.com/weblog/how-to-build-pcl-for-android-memo/

成功完成。但是,我不知道如何在我的项目中使用该库,有人可以详细说明吗?

我正在尝试在https://github.com/roomplan/tango-examples-java.git(带有 PCL 的点云)中运行代码,并且我尝试编写一个 Android.mk 文件,但我有字段。

请注意,我正在使用带有 NDK 的 Android Studio,并使用 Windows 8 作为运行操作系统。

编辑: 我已经解决了 PCL 链接到我的项目的问题,该库已识别并且项目已成功构建。但是,当我在 Tango 设备上运行应用程序时,我得到了一个 UnsatisfiedLinkexception 如下:

? E/art: dlopen("/data/app-lib/com.projecttango.experiments.javapointcloud-2/libhelloPcl.so", RTLD_LAZY) failed: dlopen failed: could not load library "libflann.so" needed by "libhelloPcl.so"; caused by library "libflann.so" not found
? D/AndroidRuntime: Shutting down VM
? E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.projecttango.experiments.javapointcloud, PID: 2119
            java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libflann.so" needed by "libhelloPcl.so"; caused by library "libflann.so" not found
            at java.lang.Runtime.loadLibrary(Runtime.java:364)
            at java.lang.System.loadLibrary(System.java:526)
            at com.projecttango.experiments.javapointcloud.PointCloudActivity.onCreate(PointCloudActivity.java:81)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2160)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2246)
            at android.app.ActivityThread.access$800(ActivityThread.java:136)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5030)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)

这是我的应用程序.MK

APP_STL := gnustl_static
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19
APP_CPPFLAGS := -frtti -fexceptions

Android.mk

LOCAL_PATH := $(call my-dir)
PROJECT_ROOT_FROM_JNI := ../../../../..
PROJECT_ROOT:= $(LOCAL_PATH)/$(PROJECT_ROOT_FROM_JNI)

PCL_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/pcl-android
BOOST_ANDROID_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/boost-android
FLANN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/flann-android
EIGEN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/eigen    

# PCL libraries
PCL_STATIC_LIB_DIR := $(PCL_INCLUDE)/lib
BOOST_STATIC_LIB_DIR := $(BOOST_ANDROID_INCLUDE)/lib
FLANN_STATIC_LIB_DIR := $(FLANN_INCLUDE)/lib

PCL_STATIC_LIBRARIES :=     pcl_common pcl_geometry pcl_kdtree pcl_octree pcl_sample_consensus pcl_surface \
                            pcl_features pcl_keypoints pcl_search pcl_tracking pcl_filters pcl_ml \
                            pcl_registration pcl_segmentation
BOOST_STATIC_LIBRARIES :=   boost_date_time boost_iostreams boost_regex boost_system \
                            boost_filesystem boost_program_options boost_signals boost_thread
FLANN_STATIC_LIBRARIES :=   flann_s flann_cpp_s


define build_pcl_static
    include $(CLEAR_VARS)
    LOCAL_MODULE:=$1
    LOCAL_SRC_FILES:=$(PCL_STATIC_LIB_DIR)/lib$1.a
    include $(PREBUILT_STATIC_LIBRARY)
endef

define build_boost_static
    include $(CLEAR_VARS)
    LOCAL_MODULE:=$1
    LOCAL_SRC_FILES:=$(BOOST_STATIC_LIB_DIR)/lib$1.a
    include $(PREBUILT_STATIC_LIBRARY)
endef

define build_flann_static
    include $(CLEAR_VARS)
    LOCAL_MODULE:=$1
    LOCAL_SRC_FILES:=$(FLANN_STATIC_LIB_DIR)/lib$1.a
    include $(PREBUILT_STATIC_LIBRARY)
endef

$(foreach module,$(PCL_STATIC_LIBRARIES),$(eval $(call build_pcl_static,$(module))))
$(foreach module,$(BOOST_STATIC_LIBRARIES),$(eval $(call build_boost_static,$(module))))
$(foreach module,$(FLANN_STATIC_LIBRARIES),$(eval $(call build_flann_static,$(module))))


include $(CLEAR_VARS)

# Project and linking

#opencv
#OPENCVROOT:= $(LOCAL_PATH)/../../../../../OpenCV-android-sdk
#OPENCV_CAMERA_MODULES:=on
#OPENCV_INSTALL_MODULES:=on
#OPENCV_LIB_TYPE:=SHARED
#include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := helloPcl

#LOCAL_SHARED_LIBRARIES := tango_client_api

LOCAL_CFLAGS    := -std=gnu++11
#-Werror -std=c++11

LOCAL_SRC_FILES := hello-pcl.ccp

LOCAL_C_INCLUDES := $(PROJECT_ROOT)/tango-gl/include \
                    $(PROJECT_ROOT)/third-party/glm/ \
                    $(PCL_INCLUDE)/include/pcl-1.6 \
                    $(BOOST_ANDROID_INCLUDE)/include \
                    $(EIGEN_INCLUDE) \
                    $(FLANN_INCLUDE)/include


LOCAL_LDFLAGS += -L$(PCL_INCLUDE)/lib  \
                 -L$(BOOST_ANDROID_INCLUDE)/lib \
                 -L$(FLANN_INCLUDE)/lib

LOCAL_SHARED_LIBRARIES   += pcl_common pcl_geometry pcl_search pcl_kdtree pcl_octree pcl_sample_consensus \
                            pcl_surface pcl_features pcl_filters pcl_keypoints pcl_tracking pcl_ml \
                            pcl_registration pcl_segmentation

LOCAL_SHARED_LIBRARIES   += boost_date_time boost_iostreams boost_regex boost_system \
                            boost_filesystem boost_program_options boost_signals boost_thread

LOCAL_SHARED_LIBRARIES   += flann flann_cpp

LOCAL_LDLIBS    += -L$(SYSROOT)/usr/lib \
                   -lstdc++ -lc -lm -llog -landroid -ldl -lGLESv2 -lEGL \
                   -lpcl_common -lpcl_geometry -lpcl_search -lpcl_kdtree -lpcl_octree -lpcl_sample_consensus \
                   -lpcl_surface -lpcl_features -lpcl_filters -lpcl_keypoints -lpcl_tracking -lpcl_ml \
                   -lpcl_registration -lpcl_segmentation \
                   -lflann -lflann_cpp

LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7 -mthumb -O3

include $(BUILD_SHARED_LIBRARY)

#$(call import-add-path, $(PROJECT_ROOT))
#$(call import-module,tango_client_api)

注意:我已将 PCL 代码更改为链接中的 HelloPCL 示例:https://github.com/otherlab/pcl/blob/master/mobile_apps/android/PCLAndroidSample

我的app.gradle如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"


    defaultConfig {
        applicationId "com.projecttango.experiments.javapointcloud"
        minSdkVersion 19
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName 'helloPcl'
        }
    }

    sourceSets.main {
        jni.srcDirs = [];
        jniLibs.srcDir 'src/main/libs'
    }


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    lintOptions {
        abortOnError false
    }
}

task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
    def ndkDir = android.ndkDirectory
    commandLine "$ndkDir/ndk-build.cmd",
            '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
            '-j', Runtime.runtime.availableProcessors(),
            'all',
            'NDK_DEBUG=1'
}

task cleanNative(type: Exec, description: 'Clean JNI object files') {
    def ndkDir = android.ndkDirectory
    commandLine "$ndkDir/ndk-build.cmd",
            '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
            'clean'
}

clean.dependsOn 'cleanNative'

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn buildNative
}

def external_lib_prefix = null
if (project.hasProperty("Tango.catkin_devel_prefix")) {
    external_lib_prefix = project.property("Tango.catkin_devel_prefix")
} else {
    // Building in standalone sample form.
    external_lib_prefix = "../../TangoReleaseLibs"
}


repositories{
    flatDir{
        dirs external_lib_prefix + '/aar'
    }
}

dependencies {
    compile(name: 'tango-ux-support-library', ext: 'aar')
    compile(name: 'tango_support_java_lib', ext: 'aar')
    compile 'org.rajawali3d:rajawali:1.0.294-SNAPSHOT@aar'
    compile(name: 'TangoUtils', ext: 'aar')
    testCompile 'junit:junit:4.12'
}

任何人都建议我解决这个错误

【问题讨论】:

    标签: android android-ndk point-cloud-library google-project-tango


    【解决方案1】:

    我已经解决了上面的问题,实际上我写的是 hello-pcl.ccp 而不是 hello-pcl.cpp。

    现在,我在 PCL 文件中遇到了构建问题。 示例:

    C:\Users\M\Desktop\Android_Projects_(Master)\tango-examples-java-master\PCL\pcl-android\include\pcl-1.6\pcl\pcl_base.h
    Error:(303, 40) error: use of deleted function 'boost::shared_ptr<const sensor_msgs::PointCloud2>::shared_ptr(const boost::shared_ptr<const sensor_msgs::PointCloud2>&)'
    Error:(329, 39) error: use of deleted function 'boost::shared_ptr<std::vector<int> >::shared_ptr(const boost::shared_ptr<std::vector<int> >&)'
           getIndices () { return (indices_); }
    

    C:\Users\M\Desktop\Android_Projects_(Master)\tango-examples-java-master\PCL\pcl-android\include\pcl-1.6\pcl\kdtree\kdtree_flann.h
    Error:(386, 25) error: use of deleted function 'boost::shared_ptr<const std::vector<int> >::shared_ptr(const boost::shared_ptr<const std::vector<int> >&)'
    Error:(393, 23) error: use of deleted function 'boost::shared_ptr<const pcl::PointCloud<Eigen::Matrix<float, -1, -1> > >::shared_ptr(const boost::shared_ptr<const pcl::PointCloud<Eigen::Matrix<float, -1, -1> > >&)'
             return (input_);
    

    我不明白为什么它会在库文件本身中给我错误和其他警告?

    谢谢

    编辑 我在源文件夹中将我的 boost 版本更改为 1.55。 此外,我已将我的 Android.mk 更改为以下内容:

    LOCAL_PATH := $(call my-dir)
    PROJECT_ROOT_FROM_JNI := ../../../../..
    PROJECT_ROOT:= $(LOCAL_PATH)/$(PROJECT_ROOT_FROM_JNI)
    
    PCL_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/pcl-android
    BOOST_ANDROID_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/boost
    FLANN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/flann-android
    EIGEN_INCLUDE := $(LOCAL_PATH)/../../../../../PCL/eigen
    BOOST_ANDROID := $(LOCAL_PATH)/../../../../../PCL/boost-android
    
    
    
    include $(CLEAR_VARS)
    
    # Project and linking
    
    #opencv
    #OPENCVROOT:= $(LOCAL_PATH)/../../../../../OpenCV-android-sdk
    #OPENCV_CAMERA_MODULES:=on
    #OPENCV_INSTALL_MODULES:=on
    #OPENCV_LIB_TYPE:=SHARED
    #include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk
    
    LOCAL_MODULE    := helloPcl
    
    #LOCAL_SHARED_LIBRARIES := tango_client_api
    
    LOCAL_CPP_FEATURES := rtti exceptions
    LOCAL_CFLAGS    := --std=c++11 -fexceptions
    #-std=gnu++11
    #-Werror -std=c++11
    
    LOCAL_SRC_FILES := hello-pcl.cpp
    
    LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
    
    LOCAL_C_INCLUDES := $(PCL_INCLUDE)/include/pcl-1.6/ \
                        $(BOOST_ANDROID_INCLUDE)/boost_1_45_0/ \
                        $(EIGEN_INCLUDE)/ \
                        $(FLANN_INCLUDE)/include/
    
    
    LOCAL_LDFLAGS += -L$(PCL_INCLUDE)/lib  \
                     -L$(BOOST_ANDROID_INCLUDE)/lib \
                     -L$(FLANN_INCLUDE)/lib
    
    
    LOCAL_SHARED_LIBRARIES   += pcl_common pcl_geometry pcl_search pcl_kdtree pcl_octree pcl_sample_consensus \
                                pcl_surface pcl_features pcl_filters pcl_keypoints pcl_tracking pcl_ml \
                                pcl_registration pcl_segmentation
    
    LOCAL_SHARED_LIBRARIES   += boost_date_time boost_iostreams boost_regex boost_system \
                                boost_filesystem boost_program_options boost_signals boost_thread
    
    LOCAL_SHARED_LIBRARIES   += flann flann_cpp
    
    #LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7 -mthumb -O3
    
    LOCAL_LDLIBS    := -llog -lGLESv2 -L$(BOOST_ANDROID)/lib -lboost_system
    # Boost Libraries
    LOCAL_LDLIBS    += -L$(BOOST_ROOT)/libs/armeabi-v7a/
    
    
    # PCL Libraries
    LOCAL_LDLIBS    += -L$(PCL_ROOT)/lib/ -lpcl_io -lpcl_io_ply -lpcl_common -lpcl_octree \
                                       -lstdc++ -lc -lm -llog -landroid -ldl -lGLESv2 -lEGL \
                                       -lpcl_common -lpcl_geometry -lpcl_search -lpcl_kdtree -lpcl_octree -lpcl_sample_consensus \
                                       -lpcl_surface -lpcl_features -lpcl_filters -lpcl_keypoints -lpcl_tracking -lpcl_ml \
                                       -lpcl_registration -lpcl_segmentation \
                                       -lflann -lflann_cpp
    
    include $(BUILD_SHARED_LIBRARY) 
    

    正如我在下面的评论中所说,所有问题都解决了,但我有一个运行问题

    无法加载“libhelloPcl.so”所需的库“libflann.so”

    【讨论】:

    • superbuild 下载了哪个版本的 boost?我记得 r10 环境的一些问题。我使用 boost 1.55 为探戈构建了一个工作 pcl
    • 感谢@stetro 重播,我刚刚发现了这个问题,我将整个源/boost 1.45 更改为 boost 1.55。它不再给我这些问题了。但是,该应用程序有一个运行问题,与我之前遇到的第一个异常 could not load library "libflann.so" 相同。我猜我的 Android.mk 必须修复,因为我读过排序很重要。
    • 我已经通过在我的活动开始时加载这个库来解决这个问题:github.com/stetro/project-tango-poc/blob/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2011-10-27
    • 2021-03-09
    相关资源
    最近更新 更多