compiler dlib et opencv avec android ndk

bendaf 07/28/2017. 1 answers, 101 views
android android build android-ndk android-ndk dlib android-studio-2.3

Je suis un développeur Android, mais je suis nouveau à Android NDK, s'il vous plaît aider, ou dites-moi quoi d'autre auriez-vous besoin / comment voulez-vous essayer de résoudre ce type de problème.

J'ai utilisé ce dlib pour l'exemple android et l' opencv officielle pour la bibliothèque android et je voudrais intégrer les deux dans une application. Lorsque j'essaye de construire le projet, j'obtiens l'erreur suivante:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':openCVSamplefacedetection:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process /home/feli/Android/Sdk/ndk-bundle/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/Android.mk NDK_APPLICATION_MK=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/Application.mk APP_ABI=mips64 NDK_ALL_ABIS=mips64 NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/lib /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj/local/mips64/libdetection_based_tracker.so}
  [mips64] Compile++      : detection_based_tracker <= DetectionBasedTracker_jni.cpp
  [mips64] Prebuilt       : libopencv_java3.so <= /home/feli/Android/openCV/OpenCV-android-sdk/sdk/native/jni/../libs/mips64/
  [mips64] SharedLibrary  : libdetection_based_tracker.so
  /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj/local/mips64/objs-debug/detection_based_tracker/DetectionBasedTracker_jni.o: In function `dlib_check_consistent_assert_usage':
  /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/dlib/dlib/threads/threads_kernel_shared.h:44: undefined reference to `USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSERTS_preprocessor_directives_'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  make: *** [/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj/local/mips64/libdetection_based_tracker.so] Error 1


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

Ma première supposition était que je n'ai pas inclus le source.cpp dans mon Android.mk, mais le placer dans les fichiers src n'a pas résolu le problème. Voici mon Android.mk:

LOCAL_PATH := $(call my-dir)

## Build dlib to static library
include $(CLEAR_VARS)
LOCAL_MODULE := dlib
LOCAL_C_INCLUDES := $(LOCAL_PATH)/dlib

LOCAL_SRC_FILES += \
                $(LOCAL_PATH)/dlib/dlib/all/source.cpp \
                $(LOCAL_PATH)/dlib//dlib/threads/threads_kernel_shared.cpp \
                $(LOCAL_PATH)/dlib/dlib/entropy_decoder/entropy_decoder_kernel_2.cpp \
                $(LOCAL_PATH)/dlib/dlib/base64/base64_kernel_1.cpp \
                $(LOCAL_PATH)/dlib/dlib/threads/threads_kernel_1.cpp \
                $(LOCAL_PATH)/dlib/dlib/threads/threads_kernel_2.cpp

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
include $(BUILD_STATIC_LIBRARY)

# Build opencv
include $(CLEAR_VARS)
OPENCVROOT := ~/Android/openCV/OpenCV-android-sdk
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE := SHARED
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

LOCAL_MODULE     := detection_based_tracker
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_SRC_FILES  := DetectionBasedTracker_jni.cpp

LOCAL_LDLIBS     += -lm -llog -ldl -lz -ljnigraphics
LOCAL_CPPFLAGS += -fexceptions -frtti -std=c++11

# LOCAL_STATIC_LIBRARIES += dlib

include $(BUILD_SHARED_LIBRARY) 

Peut-être que le NDK_PROJECT_PATH=null est le problème? Alors pourquoi les deux bibliothèques construisent séparément? Ou quoi d'autre peut être le problème? J'ai beaucoup essayé de modifier le Android.mk, mais ça fonctionne est un mystère pour moi. Toute aide ou opinion serait utile.

EDIT:

Lorsque je commente la ligne LOCAL_STATIC_LIBRARIES += dlib , j'ai l'exception suivante:

Build command failed.
  Error while executing process /home/feli/Android/Sdk/ndk-bundle/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/Android.mk NDK_APPLICATION_MK=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/Application.mk APP_ABI=mips64 NDK_ALL_ABIS=mips64 NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/lib /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj/local/mips64/libdetection_based_tracker.so}
  [mips64] Compile++      : detection_based_tracker <= DetectionBasedTracker_jni.cpp
  [mips64] Compile++      : dlib <= source.cpp
  In file included from /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/dlib/dlib/all/source.cpp:76:
  In file included from /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/dlib/dlib/all/../gui_widgets/fonts.cpp:14:
  /home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/dlib/dlib/all/../gui_widgets/nativefont.h:27:10: fatal error: 'X11/Xlib.h' file not found
  #include            ^~~~~~~~~~~~
  1 error generated.
  make: *** [/home/feli/Development/android/test/face-detection/openCVSamplefacedetection/build/intermediates/ndkBuild/debug/obj/local/mips64/objs-debug/dlib//home/feli/Development/android/test/face-detection/openCVSamplefacedetection/src/main/jni/dlib/dlib/all/source.o] Error 1 
5 Comments
Alex Cohn 07/28/2017
Avez-vous vraiment besoin de construire MIPS? Si vous avez l'intention d'exécuter votre application sur les périphériques ARM, ajoutez abiFilters= "armeabi_v7a" à votre script build.gradle .
bendaf 07/30/2017
Je cours sur abi arm64-v8a, mais je modifie aussi le code c ++ natif, donc je suppose que j'ai besoin de le construire aussi.
Alex Cohn 07/30/2017
Vous ne devez pas commenter LOCAL_STATIC_LIBRARIES += dlib
bendaf 07/31/2017
J'ai édité ma question, veuillez la vérifier si vous avez le temps
1 Alex Cohn 07/31/2017
Non, vous ne devriez pas vous inquiéter de NDK_PROJECT_PATH , c'est ainsi que Android Studio configure la version native via ndk-build . Mais dlib est structuré autour de cmake , donc devrait reproduire les paramètres de construction utilisés ici.

1 Answers


Alex Cohn 07/31/2017.

dlib utilise cmake , et ce n'est pas une installation triviale. Un professionnel de l'expérience peut mettre longtemps à préparer les scripts ndk-build pour cette bibliothèque.

Je suggère que vous construisiez votre bibliothèque native avec cmake , au lieu de ndk-build . Vous pouvez trouver un exemple de bibliothèque native utilisant OpenCv sur GitHub .

Aussi, je suggère que vous commenciez avec abiFilters mis à un seul ABI plus pertinent, et seulement quand vous voyez que tout fonctionne pour vous, vous pouvez construire votre projet pour d'autres ABI. Rappelez-vous que pour certaines bibliothèques, le portage vers tous les ABI peut être difficile. Et si vous n'avez pas une plate-forme pour effectuer au moins une brève vérification de santé pour certains ABI, il n'y a aucun sens à construire pour cela.

1 comments
bendaf 07/31/2017
Merci, je vais essayer ça!

Related questions

Hot questions

Language

Popular Tags