android - एंड्रॉइड स्टूडियो पर CMake के माध्यम से Native C कोड में OpenCV जोड़ना




java-native-interface (2)

Ahasbini द्वारा उल्लिखित मैनुअल विधि ने काम किया ( Android Studio पर CMake के माध्यम से Native C कोड में OpenCV को जोड़ना ), हालाँकि Android Studio / SDK (3.1.3) के वर्तमान संस्करण के लिए कुछ मामूली समायोजन आवश्यक थे;

1 compile की घटना को implementation में बदलें (10) एप्लिकेशन बिल्ड.ग्रेडल ( अभी भी चेतावनी मिल रही है: कॉन्फ़िगरेशन 'संकलन' अप्रचलित है और इसे 'कार्यान्वयन' के साथ बदल दिया गया है )। और (9) एप्लिकेशन CMakeLists.txt अपने लक्ष्य काम (जैसे YOUR_TARGET_LIB native-lib ) के साथ YOUR_TARGET_LIB को बदलना सुनिश्चित करता है।

2 एसटीएल को gnustl_shared ( gnustl_shared और gnustl_shared साथ एंड्रॉइड पर त्रुटियों को जोड़ना ); edit (8) app build.gradle;

defaultConfig {
...
externalNativeBuild {
  cmake {
    ...
    arguments "-DANDROID_STL=gnustl_shared"
  }
}

यह लिंक किए गए opencv पुस्तकालयों के भीतर संदर्भित त्रुटियों को रोकता है (उदाहरण के लिए error: undefined reference to std:: ... )

3 C ++ 11 का समर्थन करने के लिए ( Android Studio के लिए C ++ 11 को कैसे सक्षम करें? / OpenCV Android देशी कोड निर्माण समस्या ); edit (8) app build.gradle;

defaultConfig {
...
externalNativeBuild {
  cmake {
    ...
    cppFlags "-std=c++11"
  }
}

फिर add_library() से पहले निम्नलिखित (9) ऐप CMakeLists.txt में add_library() ;

set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a")

यह निम्न त्रुटि को रोकता है; relocation R_386_GOTOFF against preemptible symbol icv_ippJumpIndexForMergedLibs cannot be used when making a shared object

मैं Cmake के माध्यम से एक Android स्टूडियो परियोजना में अपने मूल सी कोड में Opencv को शामिल करने की कोशिश कर रहा हूं। मैंने कुछ शोध ऑनलाइन किए और ऑनलाइन से FindOpenCV.cmake फ़ाइल डाउनलोड की और इसे अपने एंड्रॉइड प्रोजेक्ट के ऐप डायरेक्टरी में जोड़ा। यह वह जगह भी है जहां CMakeLists.txt स्थित है। मैंने इस ट्यूटोरियल का उपयोग करते हुए अपने एंड्रॉइड स्टूडियो प्रोजेक्ट पर OpenCV को एक मॉड्यूल के रूप में आयात किया: https://www.learn2crack.com/2016/03/setup-opencv-sdk-android-studio.html , और जब मैं चलता हूं:

if(!OpenCVLoader.initDebug()){
   System.out.println("Opencv not loaded");
} else {
   System.out.println("Opencv loaded");
}

मुझे लगता है कि Opencv भरी हुई है।

हालाँकि, चूंकि मैं अपने मूल कोड में OpenCV जोड़ने की कोशिश कर रहा हूं, और जावा कोड नहीं, इसलिए मुझे नहीं लगता कि मैं इसका उपयोग कर सकता हूं। यहाँ सीएमकेलिस्ट मैं अभी है:

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} FindOpenCV.cmake)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library(# Specifies the name of the library.
        apriltag

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        src/main/apriltag/apriltag.c
        src/main/apriltag/apriltag_jni.c
        src/main/apriltag/apriltag_quad_thresh.c
        src/main/apriltag/common/g2d.c
        src/main/apriltag/common/getopt.c
        src/main/apriltag/common/homography.c
        src/main/apriltag/common/image_f32.c
        src/main/apriltag/common/image_u8.c
        src/main/apriltag/common/image_u8x3.c
        src/main/apriltag/common/matd.c
        src/main/apriltag/common/pnm.c
        src/main/apriltag/common/string_util.c
        src/main/apriltag/common/svd22.c
        src/main/apriltag/common/time_util.c
        src/main/apriltag/common/unionfind.c
        src/main/apriltag/common/workerpool.c
        src/main/apriltag/common/zarray.c
        src/main/apriltag/common/zhash.c
        src/main/apriltag/common/zmaxheap.c
        src/main/apriltag/tag16h5.c
        src/main/apriltag/tag25h7.c
        src/main/apriltag/tag25h9.c
        src/main/apriltag/tag36artoolkit.c
        src/main/apriltag/tag36h10.c
        src/main/apriltag/tag36h11.c
        )

STRING(REPLACE "-O0" "-O4" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
STRING(REPLACE "-O2" "-O4" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})

include_directories(src/main/apriltag/)
include_directories(${OpenCV_INCLUDE_DIRS})

find_package(OpenCV REQUIRED)

find_library(log-lib log)
find_library(jnigraphics-lib jnigraphics)
target_link_libraries(apriltag ${log-lib} ${jnigraphics-lib})

यहां वे त्रुटियां हैं जो मुझे ग्रेडेल बनाते समय मिल रही हैं:

By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has 
asked CMake to find a package configuration file provided by "OpenCV", but 
CMake did not find one. 
Could not find a package configuration file provided by "OpenCV" with any of 
the following names:
OpenCVConfig.cmake
opencv-config.cmake
Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set 
"OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" 
provides a separate development package or SDK, be sure it has been 
installed.

तो मेरे सवाल हैं:

  1. क्या मैं आयातित OpenCV का उपयोग कर सकता हूं या क्या मुझे एक अलग opencv डाउनलोड करना होगा और इसे कहीं और स्टोर करना होगा?
  2. निर्माण करने के लिए मुझे अपने सीमलेकलिस्ट्स.टेक्स्ट में क्या बदलाव करना है?

आदर्श रूप से, मैं #include <opencv2/opencv.hpp> जोड़ना चाहता हूं और अपनी सी फाइल में using namespace cv और opencv फ़ंक्शन का उपयोग करने वाले कार्यों को जोड़ना चाहता हूं।

किसी भी मदद के लिए धन्यवाद!


मैंने @ अक्षिनी के उत्तर का उपयोग किया और जब मैंने अपनी मूल सीपीपी फ़ाइल में ओपन सीवी लिबास का उपयोग करना चाहा तो उसमें त्रुटि हुई।

यह साझा लिबास को जोड़ते समय कुछ त्रुटि उत्पन्न करता है, लेकिन केवल तभी जब मैंने अपनी कक्षाओं को अपनी फ़ाइल में एक्सेस किया हो।

बदलना

find_package(OpenCV REQUIRED)

सेवा

find_package(OpenCV REQUIRED java)

इसे मेरे लिए तय किया





java-native-interface