Библиотека C ++ с Tensorflow на Android - PullRequest
4 голосов
/ 06 января 2020

Я пытаюсь создать собственную библиотеку C ++ для приложения Android. Эта библиотека использует Tensorflow C ++ API (версии 1.9.0 и 1.10.0) и OpenCV (3.3.0) внутри. Для создания оболочки я использую Swig. Я использую Android NDK для создания * .so файлов (я пробовал использовать разные версии NDK версий 10, 14, 15, 17). Я собрал файлы * .a (libtensorflow-core.a, nsyn c .a, libprotobuf.a) из исходных файлов.

defaultConfig {
    minSdkVersion 21
    targetSdkVersion 28
}

У меня есть следующие файлы: Android .mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS) 
LOCAL_MODULE    := libnsync
LOCAL_SRC_FILES := $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/downloads/nsync/builds/armeabi-v7a.android.c++11/nsync.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libprotobuf
LOCAL_SRC_FILES := $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/gen/protobuf_android/armeabi-v7a/lib/libprotobuf.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := libtensorflow
LOCAL_SRC_FILES := $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/gen/lib/android_armeabi-v7a/libtensorflow-core.a
LOCAL_EXPORT_C_INCLUDES := \
  $(PATH_TO_TENSORFLOW) \
  $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/gen/host_obj \
  $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/downloads/eigen \
  $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/gen/protobuf_android/armeabi-v7a/include \
  $(PATH_TO_TENSORFLOW)/tensorflow/core/public \
  $(PATH_TO_TENSORFLOW)/tensorflow/contrib/makefile/downloads/nsync/public
LOCAL_STATIC_LIBRARIES += libprotobuf libnsync
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_ARM_NEON := true
OPENCV_CAMERA_MODULES := off
include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk

LOCAL_MODULE    := libOcr
LOCAL_SRC_FILES := ocr/Ocr_wrap.cxx
LOCAL_LDLIBS    += -landroid -llog -ldl
LOCAL_CPPFLAGS  += -std=c++11
LOCAL_STATIC_LIBRARIES += libprotobuf libtensorflow

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_shared
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI :=  armeabi-v7a
APP_PLATFORM := android-21 #updated from 19 to 21
APP_OPTIM := release
LOCAL_ARM_NEON := true

Во время сборки я столкнулся с множеством ошибок, и последняя - :

[armeabi-v7a] SharedLibrary  : libOcr.so
[armeabi-v7a] Install        : liblept.so => libs/armeabi-v7a/liblept.so
[armeabi-v7a] Install        : libtess.so => libs/armeabi-v7a/libtess.so
[armeabi-v7a] Install        : libgnustl_shared.so => libs/armeabi-v7a/libgnustl_shared.so
/Users/tensorflow/tensorflow/contrib/makefile/gen/lib/android_armeabi-v7a/libtensorflow-core.a(str_util.o):str_util.cc:function tensorflow::str_util::CUnescape(tensorflow::StringPiece, std::string*, std::string*): error: undefined reference to 'std::__throw_out_of_range_fmt(char const*, ...)'
/Users/tensorflow/tensorflow/contrib/makefile/gen/lib/android_armeabi-v7a/libtensorflow-core.a(log_memory.o):log_memory.cc:function tensorflow::LogMemory::RecordStep(long long, std::string const&): error: undefined reference to 'std::__throw_out_of_range_fmt(char const*, ...)'
/Users/tensorflow/tensorflow/contrib/makefile/gen/lib/android_armeabi-v7a/libtensorflow-core.a(log_memory.o):log_memory.cc:function tensorflow::LogMemory::RecordTensorAllocation(std::string const&, long long, tensorflow::Tensor const&): error: undefined reference to 'std::__throw_out_of_range_fmt(char const*, ...)'
/Users/tensorflow/tensorflow/contrib/makefile/gen/lib/android_armeabi-v7a/libtensorflow-core.a(log_memory.o):log_memory.cc:function tensorflow::LogMemory::RecordTensorDeallocation(long long, std::string const&): error: undefined reference to 'std::__throw_out_of_range_fmt(char const*, ...)'
collect2: error: ld returned 1 exit status
make: *** [/Users/app/app/src/main/obj/local/armeabi-v7a/libOcr.so] Error 1
make: Leaving directory `/Users/app/app/src/main/jni'
:sdk:buildNative FAILED

FAILURE: Build failed with an exception.

Для создания файлов * .so я использую следующую задачу в файле build.gradle:

commandLine "$ndkDir/ndk-build",
            '-C', file('src/main/jni').absolutePath,
            '-j', Runtime.runtime.availableProcessors(),
            'all',
            'NDK_LOG=1'

Уважаемое сообщество, пожалуйста, помогите мне разобраться в этих проблемах. Спасибо.

Обновлено : APP_PLATFORM изменено на android-21, лучшие результаты, но все еще есть ошибки

1 Ответ

0 голосов
/ 06 января 2020

У меня раньше была эта проблема, это библиотека p oop

...