我用
为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;找不到