2016-04-22 2 views
3

Недавно я пытаюсь переместить некоторые предсказать функцию модели Caffe (C++) для Android платформы (уровень NDK) this is the link: И эта модель нуждается в поддержке OpenCV/OpenCV2 и Google :: protobuf. меня включают в себя все необходимое LIB (.a) из OpenCV в Android.mk для компиляции в .so Lib, предусмотренной для Java, как показано ниже (в Android.mk):Google :: Protobuf используется в андроиде НКА разработки

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) 

ТОГДА Я компилирую Устройство Google :: Protobuf-2.5.0 с андроид-NDK-r11c в ubuntu14.04, чтобы получить три статическую библиотеку (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) 

, но проблема возникает, когда я НДК-строить 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) 

$NDK|ndk-build meet the error of std

проблема, кажется, не хватает какой-то части СТЛ-библиотеки, но в build_library.sh: CXXFLAGS = "- марш = ARMv7-а -I $ CXXSTL/включают -I $ CXXSTL/LIBS/armeabi-v7a/включают -L $ CXXSTL/ЛИЭС/а rmeabi-v7a/-lgnustl_static»

меня включают gnu_stl статические и в том же каталоге android.mk, то Application.mk также указать gnustl:

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

Я действительно надеюсь, что кто-то может дайте мне совет об этой ситуации.

ответ

6

Вероятно, вы знаете, но есть конкретные андроид-кофейная порт, с примерами:

библиотека: https://github.com/sh1r0/caffe-android-lib

В Caffe/андроида папке есть JNI обертка и caffe_mobile файлы

Пример :

https://github.com/sh1r0/caffe-android-demo

Он использует андроид-21 Nati ve API, и он не поддерживает некоторые библиотеки io, такие как (leveldb, lmdb и hdf5, только cpu).

В библиотеке есть много скриптов для загрузки каждых 3rparty зависимостей (Protobuf, GFLAGS, eigem, openblas,). Eigen3 определяется по умолчанию, но он может использовать openblas_library только для процессоров манипуляторов.

У меня аналогичная проблема, но в моем случае моя проблема СТЛ библиотека приходит, когда я пытаюсь связать свою собственную библиотеку .so обертку с помощью CMake кросс-компиляции инструментов. gnustl_static не работает, и он не работает при компоновке библиотеки boost.

directory_iterator_increment(boost::filesystem::directory_iterator&, boost::system::error_code*): error: undefined reference to 'stpcpy' 

В любом случае, я надеюсь, что эти ссылки помогут вам решить проблему.

Cheers

Смежные вопросы