打开CV java.lang.UnsatisfiedLinkError:n_Mat随机发生

时间:2013-09-24 21:29:59

标签: android opencv mat

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

  

java.lang.UnsatisfiedLinkError:n_Mat at   org.opencv.core.Mat.n_Mat(Native Method)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)at   android.view.ViewGroup.drawChild(ViewGroup.java:1644)at   android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)at   android.view.ViewGroup.drawChild(ViewGroup.java:1644)at   android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)at   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)at   android.view.View.draw(View.java:6883)at   android.widget.FrameLayout.draw(FrameLayout.java:357)at   com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1921)   在android.view.ViewRoot.draw(ViewRoot.java:1528)at   android.view.ViewRoot.performTraversals(ViewRoot.java:1264)at   android.view.ViewRoot.handleMessage(ViewRoot.java:1866)at   android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:130)at   android.app.ActivityThread.main(ActivityThread.java:3687)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:507)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)at   dalvik.system.NativeStart.main(原生方法)

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

此外,我知道活动开始时会发生崩溃,而且此设备上的崩溃最多(不知道这是否与设备有关):ALCATEL ONE TOUCH 985N(one_touch_985N_gsm),Nexus One(激情),Galaxy Ace(GT) -S5830D)...

谢谢

1 个答案:

答案 0 :(得分:1)

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

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