compile dlib και opencv με το android ndk

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

Είμαι προγραμματιστής Android, αλλά είμαι νέος στο Android NDK, παρακαλώ βοηθήστε ή πείτε μου τι άλλο θα χρειαστείτε / πώς θα προσπαθούσατε να λύσετε αυτό το είδος προβλήματος.

Έχω χρησιμοποιήσει αυτό το dlib για το παράδειγμα του Android και το επίσημο opencv για τη βιβλιοθήκη Android και θα ήθελα να ενσωματώσω τα δύο σε μία εφαρμογή. Όταν προσπαθώ να οικοδομήσω το έργο έχω το ακόλουθο σφάλμα:

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. 

Η πρώτη μου εικασία ήταν ότι δεν έχω συμπεριλάβει το source.cpp στο Android.mk μου, αλλά τοποθετώντας το στα αρχεία src δεν λύνω το πορφυρό. Εδώ είναι το 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) 

Ίσως το NDK_PROJECT_PATH=null ; Γιατί οι δύο βιβλιοθήκες κτίζονται ξεχωριστά; Ή τι άλλο μπορεί να είναι το πρόβλημα; Προσπάθησα πολύ να τροποποιήσω το Android.mk, αλλά λειτουργεί είναι ένα μυστήριο για μένα. Οποιαδήποτε βοήθεια ή γνώμη θα ήταν χρήσιμη.

EDIT:

Όταν σχολιάσω τη γραμμή LOCAL_STATIC_LIBRARIES += dlib , έχω την ακόλουθη εξαίρεση:

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
Χρειάζεστε πραγματικά MIPS build; Αν σκοπεύετε να εκτελέσετε την εφαρμογή σας σε συσκευές ARM, προσθέστε abiFilters= "armeabi_v7a" στη build.gradle ενεργειών build.gradle .
bendaf 07/30/2017
Έχω τρέξει στο abi arm64-v8a, αλλά αλλάζω και τον φυσικό κώδικα c ++, οπότε υποθέτω ότι πρέπει να το κάνω επίσης.
Alex Cohn 07/30/2017
Δεν πρέπει να σχολιάζετε LOCAL_STATIC_LIBRARIES += dlib
bendaf 07/31/2017
Έχω επεξεργαστεί την ερώτησή μου, παρακαλώ ελέγξτε εάν έχετε χρόνο
1 Alex Cohn 07/31/2017
Όχι, δεν πρέπει να ανησυχείτε για το NDK_PROJECT_PATH , έτσι το Android Studio διαμορφώνει τη φυσική κατασκευή μέσω του ndk-build . Αλλά το dlib είναι δομημένο γύρω από το cmake , οπότε θα πρέπει να αναπαράγει τις ρυθμίσεις κατασκευής που χρησιμοποιούνται εκεί.

1 Answers


Alex Cohn 07/31/2017.

dlib χρησιμοποιεί το cmake , και δεν είναι μια τετριμμένη ρύθμιση. Μπορεί να χρειαστεί πολύς χρόνος για μια επαγγελματική εμπειρία να προετοιμάσει τα scripts ndk-build για αυτή τη βιβλιοθήκη.

Προτείνω να δημιουργήσετε τη μητρική σας βιβλιοθήκη με cmake , αντί για ndk-build . Μπορείτε να βρείτε ένα παράδειγμα μιας εγγενής βιβλιοθήκης που χρησιμοποιεί το OpenCv στο GitHub .

Επίσης, προτείνω να ξεκινήσετε με το abiFilters ορίσετε μόνο ένα πιο σχετικό ABI και μόνο όταν βλέπετε ότι όλα λειτουργούν για εσάς, μπορείτε να δημιουργήσετε το έργο σας για άλλα ABI. Να θυμάστε ότι για ορισμένες βιβλιοθήκες που μεταφέρονται σε όλα τα ABI μπορεί να είναι δύσκολη. Και αν δεν έχετε μια πλατφόρμα για να εκτελέσετε τουλάχιστον έναν σύντομο έλεγχο ευεξίας για κάποιο ABI, δεν έχει νόημα να το κτίσετε.

1 comments
bendaf 07/31/2017
Ευχαριστώ, θα το δοκιμάσω!

Related questions

Hot questions

Language

Popular Tags