2013-09-24 108 views
0

我有一個應用程序在市場上使用openCV類似300.000下載。我經常得到這個錯誤崩潰報告(也許1個用戶從50)(從未得到這個錯誤我在野火的Nexus 4 /一個/ S):Open CV java.lang.UnsatisfiedLinkError:n_Mat隨機發生

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) at org.opencv.android.JavaCameraView.connectCamera(JavaCameraView.java:450) at org.opencv.android.CameraBridgeViewBase.onEnterStartedState(CameraBridgeViewBase.java:397) at org.opencv.android.CameraBridgeViewBase.processEnterState(CameraBridgeViewBase.java:355) at org.opencv.android.CameraBridgeViewBase.checkCurrentState(CameraBridgeViewBase.java:348) at org.opencv.android.CameraBridgeViewBase.surfaceChanged(CameraBridgeViewBase.java:223) at android.view.SurfaceView.updateWindow(SurfaceView.java:558) at 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) at 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) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) at dalvik.system.NativeStart.main(Native Method)

我使用靜態初始化的OpenCV(我不希望我的用戶在安裝我的應用程序時下載其他應用程序)並複製armeabiarmeabi-v7a,mips,x86中所有需要的庫.so。

另外我知道崩潰發生在活動開始時,這個設備上最多(不知道這是否可能與設備有關):ALCATEL ONE TOUCH 985N(one_touch_985N_gsm),Nexus One(激情),Galaxy Ace( GT-S5830D)...

謝謝

回答

1

我得到了相同的行爲,當我試圖用靜態庫initialization.Static初始化作爲OpenCV introduction。這提到的不使用,因爲原生如果未使用異步初始化,則在訪問Java代碼之前,可能不會爲OpenCV加載庫。發生這種情況的原因是OpenCV只是提供了一個C++包裝器(在這裏是JNI代碼)。因此,這可能會「隨機」發生,因爲在應用程序開始訪問代碼的OpenCV部分之前,庫可能會被加載,這可能不會導致崩潰。此外,該應用程序實際上會在崩潰後下次運行,因爲這些庫可能已在上次崩潰時加載。

總之,使用生產代碼的異步初始化更安全。

+0

謝謝您的回答,但我們要保持我們的應用程序越簡單越好是否有任何其他方式做到這一點無需下載OpenCV的應用程序? – jDourlens

+0

不幸的是,這是使用Android的OpenCV的問題之一。我不是一個Android開發人員,但我認爲,如果你能找到一個方法調用的代碼OpenCV的部分前初始化本地C++庫,或寫自己的包裝爲C++代碼(如果它只是你的代碼的一小部分),它可能會起作用,儘管如果你使用它的很多部分會很費力。 – Vinodh

+0

感謝您的回答。這是我所擔心的......我會深入探索一種加載C++代碼的安全方式。 – jDourlens