kompiliere dlib und opencv mit android ndk

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

Ich bin ein Android-Entwickler, aber ich bin neu für Android NDK, bitte helfen Sie mir, oder sagen Sie mir, was Sie sonst noch brauchen / wie würden Sie versuchen, diese Art von Problem zu lösen.

Ich benutzte diese dlib für Android-Beispiel und die offizielle opencv für Android-Bibliothek, und ich möchte die beiden in einer Anwendung integrieren. Wenn ich versuche, das Projekt zu erstellen, erhalte ich den folgenden Fehler:

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. 

Meine erste Vermutung war, dass ich die source.cpp nicht in meine Android.mk aufgenommen habe, aber das Einfügen in die src-Dateien hat das Problem nicht gelöst. Hier ist mein 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) 

Vielleicht ist der NDK_PROJECT_PATH=null das Problem? Dann, warum die zwei Bibliotheken getrennt bauen? Oder was kann sonst noch das Problem sein? Ich habe viel versucht, die Android.mk zu modifizieren, aber es funktioniert, ist ein Rätsel für mich. Jede Hilfe oder Meinung wäre nützlich.

EDIT:

Wenn ich die LOCAL_STATIC_LIBRARIES += dlib , habe ich die folgende Ausnahme:

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
Benötigen Sie wirklich MIPS Build? Wenn Sie beabsichtigen, Ihre App auf ARM-Geräten abiFilters= "armeabi_v7a" , fügen Sie abiFilters= "armeabi_v7a" zu Ihrem Skript build.gradle .
bendaf 07/30/2017
Ich laufe auf abi arm64-v8a, aber ich modifiziere auch den nativen C ++ Code, also nehme ich an, dass ich ihn auch bauen muss.
Alex Cohn 07/30/2017
Sie sollten LOCAL_STATIC_LIBRARIES += dlib nicht LOCAL_STATIC_LIBRARIES += dlib
bendaf 07/31/2017
Ich habe meine Frage bearbeitet, bitte überprüfen Sie, ob Sie Zeit haben
1 Alex Cohn 07/31/2017
Nein, Sie sollten sich keine Gedanken über NDK_PROJECT_PATH , so konfiguriert Android Studio den nativen Build über ndk-build . Aber dlib ist um cmake herum cmake , sollte also die dort verwendeten Build-Einstellungen reproduzieren.

1 Answers


Alex Cohn 07/31/2017.

dlib verwendet cmake , und es ist kein cmake Setup. Es kann lange dauern, bis ein erfahrener ndk-build die ndk-build Skripte für diese Bibliothek vorbereitet.

Ich schlage vor, dass Sie Ihre native Bibliothek mit cmake anstelle von ndk-build . Sie können ein Beispiel für eine native Bibliothek finden, die OpenCv auf GitHub verwendet .

Außerdem schlage ich vor, dass Sie mit abiFilters nur auf eine relevanteste ABI setzen, und nur wenn Sie sehen, dass alles für Sie funktioniert, können Sie Ihr Projekt für andere ABIs erstellen. Beachten Sie, dass für einige Bibliotheken die Portierung auf alle ABIs schwierig sein kann. Und wenn Sie nicht über eine Plattform verfügen, um zumindest eine kurze Plausibilitätsprüfung für einige ABI durchzuführen, ist es sinnlos, dafür zu bauen.

1 comments
bendaf 07/31/2017
Danke, ich werde es versuchen!

Related questions

Hot questions

Language

Popular Tags