java.lang.NoSuchMethodError: No static method boundingRect(Lorg/opencv/core/Mat;)
java.lang.NoSuchMethodError: No static method boundingRect(Lorg/opencv/core/Mat;)
我有一些 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
compileSdk: 31
我通过在 build.gradle
中为 implementation (group: 'org.bytedeco', name: 'javacv', version: '1.5.5')
指定 exclude group: 'org.bytedeco', module: 'opencv'
解决了我的问题。
所以现在我的依赖项看起来像这样:
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
文件夹并将文件夹从 sdk\native\libs
复制到其中。所以,问题出在 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 compileSdk: 31
我通过在 build.gradle
中为 implementation (group: 'org.bytedeco', name: 'javacv', version: '1.5.5')
指定 exclude group: 'org.bytedeco', module: 'opencv'
解决了我的问题。
所以现在我的依赖项看起来像这样:
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
文件夹并将文件夹从 sdk\native\libs
复制到其中。所以,问题出在 OpenCV