java.lang.noSuchMethod Ошибка: Нет статического метода привязки(Lorg/opencv/core/Mat;)

#java #android #opencv

Вопрос:

У меня есть код для Android, который должен находить контуры и очерчивать их прямоугольниками. У меня нет проблем с инициализацией OpenCV (все остальные функции работают нормально). Но когда я запускаю Imgproc.boundingRect(contours.get(i)); java.lang.NoSuchMethodError , возникает ошибка.

 2021-09-03 18:24:24.331 23081-23081/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.fern.mangoeye, PID: 23081
    java.lang.NoSuchMethodError: No static method boundingRect(Lorg/opencv/core/Mat;)Lorg/opencv/core/Rect; in class Lorg/opencv/imgproc/Imgproc; or its super classes (declaration of 'org.opencv.imgproc.Imgproc' appears in /data/app/com.fern.mangoeye-jmLx1kABmB7GFFie5xaCyA==/base.apk!classes9.dex)
        at com.fern.mangoeye.OpenCVHandler.feedNewYUVData(OpenCVHandler.java:132)
        at com.fern.mangoeye.CameraView.onPreviewFrame(CameraView.java:140)
        at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1221)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8167)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
 

Инициализация OpenCV имеет OpenCVLoader.initDebug() , а также BaseLoaderCallback

Версия OpenCV SDK: 3.4.1 компиляции: 31

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

1. Вы включили собственные библиотеки

2. Собственные библиотеки @KaruneshPalekar ( jni папка) копируются в папку libs в проекте и подключаются с помощью implementation group: 'org.bytedeco', name: 'opencv', version: '4.5.1-1.5.5', classifier: .... , но это также не принесло никаких результатов.

3. Опечатка. Я имею в виду sdknativelibs папку. Я попытался скопировать его содержимое в applibs и srcmainjniLibs

Ответ №1:

Я решил свою проблему, указав exclude group: 'org.bytedeco', module: 'opencv' для implementation (group: 'org.bytedeco', name: 'javacv', version: '1.5.5') in build.gradle . Итак, теперь мои зависимости выглядят так:

 dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4. '
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    implementation project(path: ':opencv')

    implementation 'org.jcodec:jcodec:0.2.5'
    
    implementation (group: 'org.bytedeco', name: 'javacv', version: '1.5.5'){
        exclude group: 'org.bytedeco', module: 'opencv'
    }

    implementation group: 'org.bytedeco', name: 'openblas', version: '0.3.13-1.5.5', classifier: 'android-arm'
    implementation group: 'org.bytedeco', name: 'openblas', version: '0.3.13-1.5.5', classifier: 'android-arm64'
    implementation group: 'org.bytedeco', name: 'openblas', version: '0.3.13-1.5.5', classifier: 'android-x86_64'
    implementation group: 'org.bytedeco', name: 'openblas', version: '0.3.13-1.5.5', classifier: 'android-x86'

    implementation group: 'org.bytedeco', name: 'ffmpeg', version: '4.3.2-1.5.5', classifier: 'android-arm'
    implementation group: 'org.bytedeco', name: 'ffmpeg', version: '4.3.2-1.5.5', classifier: 'android-arm64'
    implementation group: 'org.bytedeco', name: 'ffmpeg', version: '4.3.2-1.5.5', classifier: 'android-x86_64'
    implementation group: 'org.bytedeco', name: 'ffmpeg', version: '4.3.2-1.5.5', classifier: 'android-x86'
}
 

Также я создал jni папку и скопировал из sdknativelibs нее папки. Итак, проблема заключалась в инициализации OpenCV

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

1. Это работает, но проще использовать javacv-платформу или другие подобные с помощью Gradle JavaCPP: github.com/bytedeco/gradle-javacpp#the-platform-plugin