Android、opencv - 尝试初始化 Mat 时未找到 long org.opencv.core.Mat.n_Mat() 的实现
Android, opencv - No implementation found for long org.opencv.core.Mat.n_Mat() when trying to initialize Mat
我想使用 OpenCV 做一些事情,我正在尝试创建 Mat
对象:
import org.opencv.core.CvType;
import org.opencv.core.Mat;
...
Mat imageMat = new Mat(CvType.CV_8U);
在这一行我得到错误:
2021-04-28 15:13:44.657 23613-23613/xxxx.yyyy E/art: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
2021-04-28 15:13:44.676 23613-23613/xxxx.yyyy D/AndroidRuntime: Shutting down VM
2021-04-28 15:13:44.686 23613-23613/xxxx.yyyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxxx.yyyy, PID: 23613
java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.<init>(Mat.java:26)
at org.opencv.core.MatOfPoint2f.<init>(MatOfPoint2f.java:12)
at xxxx.yyyy.Utils.quadrilateralToRect(Utils.java:77)
at xxxx.yyyy.activities.CropActivity.onClick(CropActivity.java:74)
at android.view.View.performClick(View.java:5619)
at android.view.View$PerformClick.run(View.java:22298)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
我在我的 android 项目中将 OpenCV 作为单独的模块,并通过在 dependencies
部分的 build.gradle 中添加 implementation project(path: ':OpenCV')
将其导入到我的主模块中。
我看到了一个 问题,但使用 OpenCvManager 回答了这个问题,我不想在我的项目中使用它。如果我做对了,我的用户将被迫在使用我的应用程序之前单独安装这个管理器,对吧?真恶心。
UPD 1
我已经添加了
static {
Log.d(TAG, "OPENCV INITIALIZATION " + (OpenCVLoader.initDebug() ? "SUCCEEDED" : "FAILED"));
}
在我的 MainActivity.java
中。它打印“SUCCEEDED”但错误并没有消失。然而,它改变了:
2021-04-28 21:09:47.798 22656-22656/xxxx.yyyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxxx.yyyy, PID: 22656
java.lang.UnsupportedOperationException: Native object address is NULL
at org.opencv.core.Mat.<init>(Mat.java:14)
at xxxx.yyyy.Utils.quadrilateralToRect(Utils.java:94)
at xxxx.yyyy.activities.CropActivity.onClick(CropActivity.java:74)
at android.view.View.performClick(View.java:5619)
at android.view.View$PerformClick.run(View.java:22298)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
UPD 2
UPD 1 中的糟糕错误是因为 new Mat()
中的参数。没有 args 还没有错误。调查仍在继续。
似乎我找到了解决方案(适用于 OpenCV 3)。需要将文件夹 sdk\native\libs
从下载的 SDK 复制到项目的根目录并将其命名为 jniLibs
。它的每个 forders 都有一个名为 libopencv_java3.so
的文件,如下所示:
此外,将此代码添加到您的主程序中可能很有用 activity:
static {
if (OpenCVLoader.initDebug()) {
Log.d(TAG, "OPENCV INITIALIZATION SUCCEEDED");
} else {
Log.d(TAG, "OPENCV INITIALIZATION FAILED BUT TRYING TO RELOAD");
System.loadLibrary("opencv_java3");
}
}
不好的一面: 这些文件在构建后会向您的 APK 添加 80 Mb。欢迎更好的解决方案。
建议使用CMake编译linkSDK,不要复制编译好的文件
您可以在您的应用程序 build.gradle 下添加 OpenCV_DIR cmake 参数
android > defaultConfig > externalNativeBuild > cmake
arguments "-DOpenCV_DIR=" + file('../sdk').absolutePath + "/native/jni",
"-DANDROID_TOOLCHAIN=clang",
"-DANDROID_STL=c++_shared"
然后使用find_package在CMake中安装OpenCV
set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})
我想使用 OpenCV 做一些事情,我正在尝试创建 Mat
对象:
import org.opencv.core.CvType;
import org.opencv.core.Mat;
...
Mat imageMat = new Mat(CvType.CV_8U);
在这一行我得到错误:
2021-04-28 15:13:44.657 23613-23613/xxxx.yyyy E/art: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
2021-04-28 15:13:44.676 23613-23613/xxxx.yyyy D/AndroidRuntime: Shutting down VM
2021-04-28 15:13:44.686 23613-23613/xxxx.yyyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxxx.yyyy, PID: 23613
java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.<init>(Mat.java:26)
at org.opencv.core.MatOfPoint2f.<init>(MatOfPoint2f.java:12)
at xxxx.yyyy.Utils.quadrilateralToRect(Utils.java:77)
at xxxx.yyyy.activities.CropActivity.onClick(CropActivity.java:74)
at android.view.View.performClick(View.java:5619)
at android.view.View$PerformClick.run(View.java:22298)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
我在我的 android 项目中将 OpenCV 作为单独的模块,并通过在 dependencies
部分的 build.gradle 中添加 implementation project(path: ':OpenCV')
将其导入到我的主模块中。
我看到了一个
UPD 1
我已经添加了
static {
Log.d(TAG, "OPENCV INITIALIZATION " + (OpenCVLoader.initDebug() ? "SUCCEEDED" : "FAILED"));
}
在我的 MainActivity.java
中。它打印“SUCCEEDED”但错误并没有消失。然而,它改变了:
2021-04-28 21:09:47.798 22656-22656/xxxx.yyyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxxx.yyyy, PID: 22656
java.lang.UnsupportedOperationException: Native object address is NULL
at org.opencv.core.Mat.<init>(Mat.java:14)
at xxxx.yyyy.Utils.quadrilateralToRect(Utils.java:94)
at xxxx.yyyy.activities.CropActivity.onClick(CropActivity.java:74)
at android.view.View.performClick(View.java:5619)
at android.view.View$PerformClick.run(View.java:22298)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
UPD 2
UPD 1 中的糟糕错误是因为 new Mat()
中的参数。没有 args 还没有错误。调查仍在继续。
似乎我找到了解决方案(适用于 OpenCV 3)。需要将文件夹 sdk\native\libs
从下载的 SDK 复制到项目的根目录并将其命名为 jniLibs
。它的每个 forders 都有一个名为 libopencv_java3.so
的文件,如下所示:
此外,将此代码添加到您的主程序中可能很有用 activity:
static {
if (OpenCVLoader.initDebug()) {
Log.d(TAG, "OPENCV INITIALIZATION SUCCEEDED");
} else {
Log.d(TAG, "OPENCV INITIALIZATION FAILED BUT TRYING TO RELOAD");
System.loadLibrary("opencv_java3");
}
}
不好的一面: 这些文件在构建后会向您的 APK 添加 80 Mb。欢迎更好的解决方案。
建议使用CMake编译linkSDK,不要复制编译好的文件
您可以在您的应用程序 build.gradle 下添加 OpenCV_DIR cmake 参数 android > defaultConfig > externalNativeBuild > cmake
arguments "-DOpenCV_DIR=" + file('../sdk').absolutePath + "/native/jni",
"-DANDROID_TOOLCHAIN=clang",
"-DANDROID_STL=c++_shared"
然后使用find_package在CMake中安装OpenCV
set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})