0

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

java.lang.UnsatisfiedLinkError: n_Mat at org.opencv.core.Mat.(Mat.java:471) at 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) at android.widget.FrameLayout.draw(FrameLayout.java:357) at android.view.ViewGroup.drawChild(ViewGroup.java:1646) at 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. 的 android.os.Handler.dispatchMessage(Handler.java:99)。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(本机方法)

我对 OpenCV 使用静态初始化(因为我不希望我的用户在安装我的应用程序时下载其他应用程序)并将所有需要的库 .so 复制到armeabi, armeabi-v7a, mips, x86.

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

谢谢

4

1 回答 1

1

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

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

于 2013-09-24T21:48:15.637 回答