我在市场上有一个使用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 armeabi
,armeabi-v7a
,{{ 1}},mips
。
此外,我知道活动开始时会发生崩溃,而且此设备上的崩溃最多(不知道这是否与设备有关):ALCATEL ONE TOUCH 985N(one_touch_985N_gsm),Nexus One(激情),Galaxy Ace(GT) -S5830D)...
谢谢
答案 0 :(得分:1)
当我尝试使用静态库初始化时,我得到了相同的行为。不会像OpenCV introduction中提到的那样使用静态初始化。这是因为在访问之前可能没有为OpenCV加载本机库如果不使用异步初始化,则为Java代码。发生这种情况的原因是OpenCV只提供了C ++的包装(在这种情况下是JNI代码)。因此,这可能是“随机”发生的,因为在app开始访问OpenCV部分代码之前库可能会被加载,这可能导致没有崩溃。此外,应用程序实际上将在崩溃后下次运行,因为库可能已在上次崩溃中加载。
总之,对生产代码使用异步初始化更安全。