0

openCV を使用して 300.000 回のダウンロードが行われているアプリを市場に出しています。私はよくクラッシュ レポート (おそらく 50 人中 1 人のユーザー) をこのエラーで受け取りました (Wildfire、Nexus 4/One/S でこのバグを自分で経験したことはありません):

java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(ネイティブ メソッド) の n_Mat。 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.java.lang.reflect.Method.invokeNative(Native Method) の android.app.ActivityThread.main(ActivityThread.java:3687) の Looper.loop(Looper.java:130) 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 に答える