包括PCL与Android Stduio

时间:2017-02-13 08:28:20

标签: android point-cloud-library

我用

为Android构建了PCL库

hcteq.wordpress.com/2014/07/14/compiling-pcl-for-android-in-windows-cmake-gui

我尝试将这些库包含在Android Studio中,项目 github.com/roomplan/tango-examples-java/tree/master/PointCloudJava_with_PCL

要编写.mk和.gradle文件,我提到了

stackoverflow.com/questions/35491012/issue-running-pcl-library-with-android-project

github.com/kalectro/pcl_groovy/blob/master/mobile_apps/android/OpenNIRecorder/jni/Android.mk

这是我的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
NDK_TOOLCHAIN_VERSION=4.9

# 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))))



# Project and linking

include $(CLEAR_VARS)

LOCAL_MODULE := helloPcl
LOCAL_CFLAGS := -std=gnu++11
LOCAL_C_INCLUDES := $(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_SRC_FILES := jni_part.cpp \
                   pcl_lib.cpp


LOCAL_LDLIBS := -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)

Application.mk

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

和build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.tangoproject.experiments.javapointcloud"
        minSdkVersion 19
        targetSdkVersion 23
        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.txt'
        }
    }
}

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
}

dependencies {
    compile project(':tangoUtils')
    compile files('libs/tango_java_lib.jar')
}

似乎我已经成功链接了.cpp文件的库,但是有一些错误显示为this link

有谁知道如何解决这个问题?感谢。

PS点云库(PCL)用户邮件列表( www.pcl-users.org/Undefined-reference-to-PCDWrite-and-PCDWriteASCII-td4043323.html )也存在类似的问题,但仍无法解答。

PS2或者任何人都可以提供在Android Studio中使用PCL的一些说明吗?

修改

我在这里修改了我的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
NDK_TOOLCHAIN_VERSION=4.9

# 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 pcl_io pcl_io_ply pcl_recognition
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))))

# Project and linking

include $(CLEAR_VARS)

LOCAL_MODULE := helloPcl
LOCAL_CFLAGS := -std=gnu++11
LOCAL_SRC_FILES := jni_part.cpp \ pcl_lib.cpp

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

LOCAL_C_INCLUDES += $(PCL_INCLUDE)/include/pcl-1.6 \
                    $(BOOST_ANDROID_INCLUDE)/include \
                    $(EIGEN_INCLUDE) \
                    $(FLANN_INCLUDE)/include

LOCAL_STATIC_LIBRARIES   += pcl_common pcl_geometry pcl_kdtree pcl_octree pcl_sample_consensus \
                            pcl_surface pcl_features pcl_io pcl_keypoints pcl_recognition \
                            pcl_search pcl_tracking pcl_filters pcl_io_ply pcl_ml \
                            pcl_registration pcl_segmentation

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

LOCAL_SHARED_LIBRARIES := tango_client_api tango_support_api
LOCAL_SHARED_LIBRARIES   += flann flann_cpp

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

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

include $(BUILD_SHARED_LIBRARY)

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

现在有不同的错误

D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinary(std::string const&, sensor_msgs::PointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&): error: undefined reference to '__page_size'
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinaryCompressedEigen(std::string const&, pcl::PointCloud<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&): error: undefined reference to '__page_size'
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinaryCompressed(std::string const&, sensor_msgs::PointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&): error: undefined reference to '__page_size'
D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni/../../../../../PCL/pcl-android/lib/libpcl_io.a(pcd_io.cpp.o):pcd_io.cpp:function pcl::PCDWriter::writeBinaryEigen(std::string const&, pcl::PointCloud<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&): error: undefined reference to '__page_size'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/obj/local/armeabi-v7a/libhelloPcl.so] Error 1

make: Leaving directory `D:/Lab/senior/PCL/PointCloudJava_with_PCL_1/pointCloudJava_with_PCL/src/main/jni'
:pointCloudJava_with_PCL:buildNative FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':pointCloudJava_with_PCL:buildNative'.
> Process 'command 'C:\Users\CAIG\AppData\Local\Android\Sdk\ndk-bundle/ndk-build.cmd'' finished with non-zero exit value 2

如果我在Android.mk中添加以下行,则不会发生错误并且可以编译成功

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

但是当运行.apk时,Android Monitor会显示

  

java.lang.UnsatisfiedLinkError:dlopen failed:library&#34; libtango_client_api.so&#34;找不到

0 个答案:

没有答案