compileer dlib en opencv met android ndk

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

Ik ben een Android-ontwikkelaar, maar ik ben nieuw bij Android NDK, help of vertel me wat je nog meer nodig zou hebben / hoe zou je dit soort problemen proberen op te lossen.

Ik gebruikte dit dlib voor android-voorbeeld en de officiële opencv voor android-bibliotheek en ik zou de twee in één applicatie willen integreren. Wanneer ik het project probeer te bouwen, krijg ik de volgende foutmelding:

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. 

Mijn eerste gok was dat ik de source.cpp niet in mijn Android.mk heb opgenomen maar dat het plaatsen van de source op de src-bestanden het porblem niet heeft opgelost. Hier is mijn 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) 

Misschien is het probleem NDK_PROJECT_PATH=null ? Waarom bouwen de twee bibliotheken dan afzonderlijk? Of wat kan anders het probleem zijn? Ik heb veel geprobeerd de Android.mk te wijzigen, maar het werkt voor mij een raadsel. Alle hulp of mening zou nuttig zijn.

EDIT:

Toen ik de LOCAL_STATIC_LIBRARIES += dlib rij LOCAL_STATIC_LIBRARIES += dlib , kreeg ik de volgende uitzondering:

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
Heb je echt MIPS build nodig? Als u uw app op ARM-apparaten wilt uitvoeren, voegt u abiFilters= "armeabi_v7a" aan uw build.gradle script.
bendaf 07/30/2017
Ik gebruik abi arm64-v8a, maar ik ben ook bezig met het aanpassen van de native c ++ code, dus ik veronderstel dat ik het ook moet bouwen.
Alex Cohn 07/30/2017
Je moet geen commentaar geven op LOCAL_STATIC_LIBRARIES += dlib
bendaf 07/31/2017
Ik heb mijn vraag bewerkt, controleer deze als je tijd hebt
1 Alex Cohn 07/31/2017
Nee, u moet zich geen zorgen maken over NDK_PROJECT_PATH , zo configureert Android Studio de native build via ndk-build . Maar dlib is gestructureerd rond cmake , dus zou de hier gebruikte cmake moeten reproduceren.

1 Answers


Alex Cohn 07/31/2017.

dlib gebruikt cmake , en het is geen triviale opstelling. Het kan lang duren voordat een ervaren professional de ndk-build scripts voor deze bibliotheek voorbereidt.

Ik stel voor dat je je eigen bibliotheek met cmake , in plaats van ndk-build . Je kunt een voorbeeld vinden van een native library die OpenCv gebruikt op GitHub .

Ik stel ook voor dat u begint met abiFilters ingesteld op slechts één meest relevante ABI, en alleen wanneer u ziet dat alles voor u werkt, kunt u uw project voor andere ABI's bouwen. Bedenk dat het voor sommige bibliotheken die aan alle ABI's porteren lastig kan zijn. En als je geen platform hebt om op zijn minst een korte sanity-check uit te voeren voor sommige ABI, heeft het geen zin om er voor te bouwen.

1 comments
bendaf 07/31/2017
Bedankt, ik zal het proberen!

Related questions

Hot questions

Language

Popular Tags