【问题标题】:Open CV java.lang.UnsatisfiedLinkError: n_Mat randomly happeningOpencv java.lang.UnsatisfiedLinkError: nMat 随机发生
【发布时间】:2013-09-24 21:29:59
【问题描述】:

我在市场上有一个使用 openCV 的应用程序,下载量约为 300.000。我经常收到包含此错误的崩溃报告(50 个用户中可能只有 1 个)(我自己在 Wildfire、Nexus 4/One/S 上从未遇到过此错误):

java.lang.UnsatisfiedLinkError: n_Mat at org.opencv.core.Mat.n_Mat(本机方法)在 org.opencv.core.Mat.(Mat.java:471) 在 org.opencv.android.JavaCameraView.initializeCamera(JavaCameraView.java:382) 在 org.opencv.android.JavaCameraView.connectCamera(JavaCameraView.java:450) 在 org.opencv.android.CameraBridgeViewBase.onEnterStartedState(CameraBridgeViewBase.java:397) 在 org.opencv.android.CameraBridgeViewBase.processEnterState(CameraBridgeViewBase.java:355) 在 org.opencv.android.CameraBridgeViewBase.checkCurrentState(CameraBridgeViewBase.java:348) 在 org.opencv.android.CameraBridgeViewBase.surfaceChanged(CameraBridgeViewBase.java:223) 在 android.view.SurfaceView.updateWindow(SurfaceView.java:558) 在 android.view.SurfaceView.dispatchDraw(SurfaceView.java:350) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1644) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 在 android.view.View.draw(View.java:6883) 在 android.widget.FrameLayout.draw(FrameLayout.java:357) 在 android.view.ViewGroup.drawChild(ViewGroup.java:1646) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 在 android.view.View.draw(View.java:6883) 在 android.widget.FrameLayout.draw(FrameLayout.java:357) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921) 在 android.view.ViewRoot.draw(ViewRoot.java:1528) 在 android.view.ViewRoot.performTraversals(ViewRoot.java:1264) 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1866) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:130) 在 android.app.ActivityThread.main(ActivityThread.java:3687) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:507) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 在 dalvik.system.NativeStart.main(Native Method)

我对 OpenCV 使用静态初始化(因为我不希望我的用户在安装我的应用程序时下载其他应用程序)并将所有需要的库 .so 复制到 armeabiarmeabi-v7amips、@987654324 @。

我也知道崩溃发生在活动开始时并且在此设备上最多(不知道这是否可能与设备相关):ALCATEL ONE TOUCH 985N (one_touch_985N_gsm)、Nexus One (passion)、Galaxy Ace (GT -S5830D)...

谢谢

【问题讨论】:

    标签: android opencv mat


    【解决方案1】:

    当我尝试使用静态库初始化时,我得到了相同的行为。不能像OpenCV introduction 中提到的那样使用静态初始化。这是因为在访问 Java 之前,可能不会为 OpenCV 加载本机库如果不使用异步初始化,则代码。发生这种情况的原因是 OpenCV 只是为 C++ 提供了一个包装器(在本例中为 JNI 代码)。因此,这可能会“随机”发生,因为库可能会在应用程序开始访问代码的 OpenCV 部分之前加载,这可能不会导致崩溃。此外,应用程序实际上会在崩溃后的下一次运行,因为库可能已在上次崩溃中加载。

    总之,对生产代码使用异步初始化更安全。

    【讨论】:

    • 感谢您的回答,但由于我们想让我们的应用程序尽可能简单,有没有其他方法可以在不下载 openCV 应用程序的情况下做到这一点?
    • 不幸的是,这是将 OpenCV 与 android 一起使用的问题之一。我不是 android 开发人员,但我认为如果你能找到一种方法在调用 OpenCV 代码部分之前初始化本机 C++ 库,或者为 C++ 代码编写自己的包装器(如果它只是你代码的一小部分),它可能会起作用,尽管如果你使用它的许多部分会很费力。
    • 感谢您的回答。这就是我所担心的。我将深入研究找到一种安全的方式来加载 C++ 代码。
    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多