google::protobuf 用于 android ndk develop
google::protobuf used in android ndk develop
我最近尝试将 Caffe 模型(c++)的一些预测功能移动到 Android 平台(ndk 级别)this is the link:
而这个模型需要OpenCV/OpenCV2和google::protobuf的支持。
我已经在 Android.mk 中包含了所有需要的 OpenCV lib(.a) 以编译成为 java 提供的 .so lib,如下所示(在 Android.mk):
include $(CLEAR_VARS)
LOCAL_MODULE := opencv_features2d
LOCAL_SRC_FILES := libopencv_features2d.a
LOCAL_EXPORT_C_INCLUDES := /home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include
include $(PREBUILT_STATIC_LIBRARY)
然后我在ubuntu14.04中用android-ndk-r11c编译google::protobuf-2.5.0得到三个静态库(libprotobuf.a,libprotobuf-lite.a,libprotoc.a),这里是build_library.sh的所有脚本:
#!/bin/bash
export NDK=/home/wm/Downloads/android-ndk-r11c
export SYSROOT=$NDK/platforms/android-15/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/
export PATH=$PATH:$TOOLCHAIN/bin
#export CC="arm-linux-androideabi-gcc --sysroot $SYSROOT"
export CXX="arm-linux-androideabi-g++ --sysroot $SYSROOT"
export CXXSTL=$NDK/sources/cxx-stl/gnu-libstdc++/4.9
function build_one
{
mkdir build
./configure --prefix=$(pwd)/build \
--host=arm-linux-androideabi \
--with-sysroot=$SYSROOT \
--enable-static \
--disable-shared \
--enable-cross-compile \
--with-protoc=protoc LIBS="-lc-lstdc++" \
# CFLAGS="-march=armv7-a" \
CXXFLAGS="-march=armv7-a -I$CXXSTL/include -I$CXXSTL/libs/armeabi-v7a/include -L$CXXSTL/libs/armeabi-v7a/ -lgnustl_static"
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
# Inspect the library architecture specific information
# arm-linux-androideabi-readelf -A build/lib/libprotobuf-lite.a
和像这样支持Opencv2/dnn模块的三个库(也在Android.mk):
include $(CLEAR_VARS)
LOCAL_MODULE := google_protobuf
LOCAL_SRC_FILES := libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(call my-dir)/sources/protobuf-2.5.0/build/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := google_protobuflite
LOCAL_SRC_FILES := libprotobuf-lite.a
LOCAL_EXPORT_C_INCLUDES := $(call my-dir)/sources/protobuf-2.5.0/build/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := google_protoc
LOCAL_SRC_FILES := libprotoc.a
LOCAL_EXPORT_C_INCLUDES := $(call my-dir)/sources/protobuf-2.5.0/build/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := opencv_dnn
LOCAL_SRC_FILES := libopencv_dnn.a
LOCAL_STATIC_LIBRARIES := google_protobuf google_protoc google_protobuflite
LOCAL_EXPORT_C_INCLUDES := /home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include
include $(PREBUILT_STATIC_LIBRARY)
但是当我 ndk-build android.mk 以获得 MyLib.so:
时问题就来了
LOCAL_MODULE := MyLib
LOCAL_C_INCLUDES :=/home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include/opencv
LOCAL_C_INCLUDES +=/home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include
LOCAL_SRC_FILES := com_example_alexandroskarargyris_myapplication_NativeClass.cpp
LOCAL_STATIC_LIBRARIES := opencv_dnn opencv_xphoto opencv_xobjdetect opencv_ximgproc opencv_xfeatures2d opencv_videostab opencv_videoio opencv_video opencv_ts opencv_line_descriptor
LOCAL_STATIC_LIBRARIES += opencv_tracking opencv_text opencv_surface_matching opencv_superres opencv_structured_light opencv_aruco opencv_bgsegm opencv_bioinspired opencv_imgproc
LOCAL_STATIC_LIBRARIES += opencv_calib3d opencv_ccalib opencv_core opencv_datasets opencv_dpm opencv_face opencv_features2d opencv_flann opencv_hal opencv_highgui opencv_imgcodecs opencv_ml
LOCAL_STATIC_LIBRARIES += opencv_objdetect opencv_optflow opencv_photo opencv_reg opencv_rgbd opencv_saliency opencv_shape opencv_stereo opencv_stitching
LOCAL_STATIC_LIBRARIES += libjpeg libwebp libpng libtiff libjasper IlmImf tbb
LOCAL_LDLIBS += -llog -lz -ldl -lm **-lstdc++**
include $(BUILD_SHARED_LIBRARY)
问题似乎缺少 stl-library 的某些部分,但在 build_library.sh 中:
CXXFLAGS="-march=armv7-a -I$CXXSTL/include -I$CXXSTL/libs/armeabi-v7a/include -L$CXXSTL/libs/armeabi-v7a/ -lgnustl_static"
我已经包含 gnu_stl static 并且在 android.mk 的同一目录中,Application.mk 也声明了 gnustl:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-15
我真的希望有人能给我一些关于这种情况的建议。
可能你知道,但有一个特定的 android-caffe 端口,示例:
图书馆:
https://github.com/sh1r0/caffe-android-lib
在 caffe/android 文件夹中有 JNI 包装器和 caffe_mobile 文件
示例:
https://github.com/sh1r0/caffe-android-demo
使用android-21原生API级别,不支持一些io库,如(leveldb,lmdb和hdf5,仅cpu)。
该库有许多脚本可以下载每个 3rparty 依赖项(protobuf、gflags、eigem、openblas 等)。
Eigen3 是默认定义的,但它只能用于 arm 处理器 openblas_library。
我有类似的问题,但就我而言,当我尝试使用 cmake 交叉编译工具 link 我自己的 .so 包装器库时,我的 stl 库出现了问题。 gnustl_static 不起作用,它在 boost 库 linking 上失败。
directory_iterator_increment(boost::filesystem::directory_iterator&, boost::system::error_code*): error: undefined reference to 'stpcpy'
无论如何,我希望这些参考资料能帮助您解决问题。
干杯
我最近尝试将 Caffe 模型(c++)的一些预测功能移动到 Android 平台(ndk 级别)this is the link: 而这个模型需要OpenCV/OpenCV2和google::protobuf的支持。 我已经在 Android.mk 中包含了所有需要的 OpenCV lib(.a) 以编译成为 java 提供的 .so lib,如下所示(在 Android.mk):
include $(CLEAR_VARS)
LOCAL_MODULE := opencv_features2d
LOCAL_SRC_FILES := libopencv_features2d.a
LOCAL_EXPORT_C_INCLUDES := /home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include
include $(PREBUILT_STATIC_LIBRARY)
然后我在ubuntu14.04中用android-ndk-r11c编译google::protobuf-2.5.0得到三个静态库(libprotobuf.a,libprotobuf-lite.a,libprotoc.a),这里是build_library.sh的所有脚本:
#!/bin/bash
export NDK=/home/wm/Downloads/android-ndk-r11c
export SYSROOT=$NDK/platforms/android-15/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/
export PATH=$PATH:$TOOLCHAIN/bin
#export CC="arm-linux-androideabi-gcc --sysroot $SYSROOT"
export CXX="arm-linux-androideabi-g++ --sysroot $SYSROOT"
export CXXSTL=$NDK/sources/cxx-stl/gnu-libstdc++/4.9
function build_one
{
mkdir build
./configure --prefix=$(pwd)/build \
--host=arm-linux-androideabi \
--with-sysroot=$SYSROOT \
--enable-static \
--disable-shared \
--enable-cross-compile \
--with-protoc=protoc LIBS="-lc-lstdc++" \
# CFLAGS="-march=armv7-a" \
CXXFLAGS="-march=armv7-a -I$CXXSTL/include -I$CXXSTL/libs/armeabi-v7a/include -L$CXXSTL/libs/armeabi-v7a/ -lgnustl_static"
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
# Inspect the library architecture specific information
# arm-linux-androideabi-readelf -A build/lib/libprotobuf-lite.a
和像这样支持Opencv2/dnn模块的三个库(也在Android.mk):
include $(CLEAR_VARS)
LOCAL_MODULE := google_protobuf
LOCAL_SRC_FILES := libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(call my-dir)/sources/protobuf-2.5.0/build/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := google_protobuflite
LOCAL_SRC_FILES := libprotobuf-lite.a
LOCAL_EXPORT_C_INCLUDES := $(call my-dir)/sources/protobuf-2.5.0/build/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := google_protoc
LOCAL_SRC_FILES := libprotoc.a
LOCAL_EXPORT_C_INCLUDES := $(call my-dir)/sources/protobuf-2.5.0/build/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := opencv_dnn
LOCAL_SRC_FILES := libopencv_dnn.a
LOCAL_STATIC_LIBRARIES := google_protobuf google_protoc google_protobuflite
LOCAL_EXPORT_C_INCLUDES := /home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include
include $(PREBUILT_STATIC_LIBRARY)
但是当我 ndk-build android.mk 以获得 MyLib.so:
时问题就来了LOCAL_MODULE := MyLib
LOCAL_C_INCLUDES :=/home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include/opencv
LOCAL_C_INCLUDES +=/home/wm/Downloads/OpenCV-android-sdk/sdk/native/jni/include
LOCAL_SRC_FILES := com_example_alexandroskarargyris_myapplication_NativeClass.cpp
LOCAL_STATIC_LIBRARIES := opencv_dnn opencv_xphoto opencv_xobjdetect opencv_ximgproc opencv_xfeatures2d opencv_videostab opencv_videoio opencv_video opencv_ts opencv_line_descriptor
LOCAL_STATIC_LIBRARIES += opencv_tracking opencv_text opencv_surface_matching opencv_superres opencv_structured_light opencv_aruco opencv_bgsegm opencv_bioinspired opencv_imgproc
LOCAL_STATIC_LIBRARIES += opencv_calib3d opencv_ccalib opencv_core opencv_datasets opencv_dpm opencv_face opencv_features2d opencv_flann opencv_hal opencv_highgui opencv_imgcodecs opencv_ml
LOCAL_STATIC_LIBRARIES += opencv_objdetect opencv_optflow opencv_photo opencv_reg opencv_rgbd opencv_saliency opencv_shape opencv_stereo opencv_stitching
LOCAL_STATIC_LIBRARIES += libjpeg libwebp libpng libtiff libjasper IlmImf tbb
LOCAL_LDLIBS += -llog -lz -ldl -lm **-lstdc++**
include $(BUILD_SHARED_LIBRARY)
问题似乎缺少 stl-library 的某些部分,但在 build_library.sh 中: CXXFLAGS="-march=armv7-a -I$CXXSTL/include -I$CXXSTL/libs/armeabi-v7a/include -L$CXXSTL/libs/armeabi-v7a/ -lgnustl_static"
我已经包含 gnu_stl static 并且在 android.mk 的同一目录中,Application.mk 也声明了 gnustl:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-15
我真的希望有人能给我一些关于这种情况的建议。
可能你知道,但有一个特定的 android-caffe 端口,示例:
图书馆: https://github.com/sh1r0/caffe-android-lib
在 caffe/android 文件夹中有 JNI 包装器和 caffe_mobile 文件
示例:
https://github.com/sh1r0/caffe-android-demo
使用android-21原生API级别,不支持一些io库,如(leveldb,lmdb和hdf5,仅cpu)。
该库有许多脚本可以下载每个 3rparty 依赖项(protobuf、gflags、eigem、openblas 等)。 Eigen3 是默认定义的,但它只能用于 arm 处理器 openblas_library。
我有类似的问题,但就我而言,当我尝试使用 cmake 交叉编译工具 link 我自己的 .so 包装器库时,我的 stl 库出现了问题。 gnustl_static 不起作用,它在 boost 库 linking 上失败。
directory_iterator_increment(boost::filesystem::directory_iterator&, boost::system::error_code*): error: undefined reference to 'stpcpy'
无论如何,我希望这些参考资料能帮助您解决问题。
干杯