Android Studio NDK несовместим, хотя был установлен правильно

#java #c #android-ndk #java-native-interface #ndk-build

#java #c #android-ndk #java-native-interface #ndk-сборка

Вопрос:

Я пытаюсь интегрировать OpenCV с Android Studio, и в процессе я сталкиваюсь с проблемами NDK. NDK всегда остается невыбранным в структуре проекта.Файлы заголовков всегда остаются недоступными, потому что путь не указан. Я пытаюсь решить эту проблему со дня на день, но не могу найти решение вышеуказанного, если кто-нибудь поможет. NDK не подключается, хотя было испробовано много способов интеграции NDK. Я использовал все возможные способы интеграции NDK и принял возможные меры для воспроизведения моих потребностей, но ничего не работает. Я видел, как другие пытались решить проблему, но ни один из них не сработал для меня.

Ниже приведен мой код CMakeLists.txt файл

 cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu  11")

include_directories(${OpenCV_DIR}/jni/include)

add_library( lib_opencv SHARED IMPORTED )

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java4.so)

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib}

                       lib_opencv)
  

native-lib.cpp

 #include <jni.h>
  

Здесь выше файл jni.h указан как не найденный, и, следовательно, JNIEXPORT и JNICALL также остаются скрытыми.

build.gradle(приложение)

 apply plugin: 'com.android.application'

android {
    compileSdkVersion 29

    defaultConfig {
        applicationId "com.karuneshpalekar.copencv"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
                arguments "-DOpenCV_DIR="   opencvsdk   "/sdk/native"
            }
        }

        ndk {
            moduleName "test"
            cFlags "-std=c  11 -fexceptions"
            stl "gnustl_shared"
        }


    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }

    packagingOptions {
        pickFirst 'lib/armeabi-v7a/libopencv_java4.so'
        pickFirst 'lib/arm64-v8a/libopencv_java4.so'
        pickFirst 'lib/x86/libopencv_java4.so'
        pickFirst 'lib/x86_64/libopencv_java4.so'
    }


}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0'
    implementation project(path: ':java')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}
  

build.gradle(java)

 apply plugin: 'com.android.library'

println "OpenCV: "   project.buildscript.sourceFile

android {
    compileSdkVersion 29
    //buildToolsVersion "x.y.z" // not needed since com.android.tools.build:gradle:3.0.0

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 29
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_6
        targetCompatibility JavaVersion.VERSION_1_6
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
            java.srcDirs = ['src/main/java']
            aidl.srcDirs = ['src']
            res.srcDirs = ['/build/master_pack-android/opencv/modules/java/android_sdk/android_gradle_lib/res']
            manifest.srcFile 'java/AndroidManifest.xml'
        }
    }
}

dependencies {
}
  

Спасибо за помощь
У меня есть Ndk-rc21 и Android Studio AGP версии 4.0.1 и Gradle Versopion 6.1.1

Комментарии:

1. Это не reddit, пожалуйста, опишите проблему в названии; не «проблема с троллингом».

2. Можете ли вы помочь мне с вышеуказанной проблемой, какие-либо решения попробовать?

3. Я понятия не имею, в чем заключается фактическая ошибка. Каков результат gradle assembleDebug и похоже ли, что он компилирует ваш собственный код? Связали ли вы свой собственный код с gradle ?

Ответ №1:

Как использовать OpenCV SDK (версия 4.4) с NDK (версия 19)

Создайте проект Android Studio с app модулем.

settings.gradle

 include ':app'
  

build.gradle

 // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.1"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  

Задайте пути к Android SDK и NDK (v19) в local.properties файле.

 sdk.dir=/home/USER/Android/Sdk
ndk.dir=/home/USER/Android/Sdk/ndk/android-ndk-r19c
  

Укажите путь к основному файлу сценария сборки cmake, используемую версию cmake и Android ABIS для компиляции в app/build.gradle файл.

 apply plugin: 'com.android.application'

android {
    compileSdkVersion 29

    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        ndk {
            abiFilters "arm64-v8a", "armeabi-v7a"
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

dependencies {
    ...
}
  

Теперь нам нужны заголовочные файлы и библиотеки из OpenCV Android SDK. Итак, скачайте и распакуйте пакет OpenCV SDK (v4.4) для Android с:https://opencv.org/releases /

Скопируйте заголовочные файлы и библиотеки OpenCV из извлеченного пакета в проект Android Studio следующим образом.

  1. Скопируйте OpenCV-android-sdk/sdk/native/staticlibs/* в app/src/main/cpp/opencv/staticlibs/

  2. Скопируйте OpenCV-android-sdk/sdk/native/3rdparty/* в app/src/main/cpp/opencv/3rdparty/

  3. Скопируйте OpenCV-android-sdk/sdk/native/jni/include/* в app/src/main/cpp/opencv/include/

Создайте следующий файл cmake в проекте.

app/src/main/cpp/opencv/opencv.cmake

 set( CURRENT_DIR ${CMAKE_CURRENT_LIST_DIR} )
set( OPENCV_INC_DIR ${CURRENT_DIR}/include )
set( OPENCV_LIBS_DIR ${CURRENT_DIR}/staticlibs/${ANDROID_ABI} )
set( THIRD_PARTY_LIBS_DIR ${CURRENT_DIR}/3rdparty/libs/${ANDROID_ABI} )

# Add opencv libs

set( lib_name opencv_calib3d )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_dnn )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_features2d )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_flann )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_gapi )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_highgui )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_imgcodecs )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_imgproc )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_ml )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_objdetect )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_photo )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_stitching )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_video )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_videoio )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

set( lib_name opencv_core )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${OPENCV_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND OPENCV_LIBS ${lib_name} )

# Add 3rd-party libs

set( lib_name ade )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name cpufeatures )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name IlmImf )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name ittnotify )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name libjasper )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name libjpeg-turbo )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name libpng )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name libprotobuf )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name libtiff )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name libwebp )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name quirc )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name tbb )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )

set( lib_name tegra_hal )
add_library( ${lib_name} STATIC IMPORTED )
set_target_properties( ${lib_name} PROPERTIES IMPORTED_LOCATION "${THIRD_PARTY_LIBS_DIR}/lib${lib_name}.a" )
list( APPEND THIRD_PARTY_LIBS ${lib_name} )
  

Включите opencv.cmake файл в основной сценарий сборки cmake, установите включаемый каталог OpenCV и свяжите библиотеки следующим образом.

app/src/main/cpp/CMakeLists.txt

 cmake_minimum_required(VERSION 3.4.1)

include( opencv/opencv.cmake )

find_library( log-lib log )
find_library( android-lib android )
find_library( jnigraphics-lib jnigraphics )
find_library( z-lib z )

add_library( native-lib SHARED
    native-lib.cpp
)

target_include_directories( native-lib PRIVATE
    ${OPENCV_INC_DIR}
)

target_link_libraries( native-lib
    ${log-lib}
    ${android-lib}
    ${jnigraphics-lib}
    ${OPENCV_LIBS}
    ${THIRD_PARTY_LIBS}
    ${z-lib}
)
  

Теперь вы можете использовать OpenCV API в вашем исходном файле C .

app/src/main/cpp/native-lib.cpp

 #include <jni.h>
#include <opencv2/core.hpp>

using namespace cv;

Mat matImage;
  

Комментарии:

1. Независимо от отсутствия ясности в OP, вопрос в форме «Я не могу заставить X работать, что не так?» на мой взгляд, не следует отвечать «вот совершенно другое решение Y».

2. Почему NDK rc19? Не совместимы ли недавно выпущенные версии для устранения вышеуказанной ошибки?

3. Ценю ваши усилия.

4. КАРУНЕШ ПАЛЕКАР, как уже упоминал @Botje, ваш вопрос неясен. Если это тот ответ, который вы ожидали, пожалуйста, отредактируйте вопрос соответствующим образом. Когда я писал этот ответ, я просто подозревал, что вы, возможно, застряли при настройке заголовочных файлов OpenCV и собственных библиотек в проекте Android Gradle, потому что я недавно столкнулся с этой проблемой и не смог найти подходящее руководство в Интернете.

Ответ №2:

Проблема, с которой я столкнулся, была не с инструментом NDK, а с каталогом, в который я его поместил.

Между именем файла был пробел, что привело к ошибке, например, «Имя пространства пользователя».например: C:/User /Elon Musk / SDK / ndk

Я исправил эту свою ошибку после отображения предупреждения Android Studio lint.

Я изменил размещение каталога Android SDK и повторно запустил код, и проблема была решена.

Согласно приведенному выше ответу Lakindu, нет необходимости в понижении рейтинга библиотеки Ndk, просто убедитесь, что NDK находится в нужном месте.

А также не забудьте добавить инструмент NDK в структуру проекта, который вы можете найти, нажав Ctrl Shift Alt S одновременно.