2012-07-23 10 views
14

nur versuchen, ein einfaches openCV android-Programm zu tun. Heruntergeladen und installiert OpenCV für Android nach dem instructions here und hinzugefügt die OpenCV-Bibliothek 2.4.2 als Bibliotheksprojekt für mein eigenes Android-Projekt wie der Befehlsstatus.Android UnbefriedigterLinkError mit OpenCV 2.4.2

Allerdings, wenn ich den Standard "Hello World Program", wie folgt, kompilieren, schlägt es fehl, wenn ich die Mat mat = new Mat(); Zeile, aber es ist sonst erfolgreich.

package com.example; 

import org.opencv.core.Mat; 

import android.app.Activity; 
import android.os.Bundle; 

public class HelloAndroidActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Mat mat = new Mat(); 
    } 
} 

Hier ist der Stack-Trace es ausdruckt:

07-23 09:59:43.835: E/AndroidRuntime(8222): FATAL EXCEPTION: main 
07-23 09:59:43.835: E/AndroidRuntime(8222): java.lang.UnsatisfiedLinkError: n_Mat 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at org.opencv.core.Mat.n_Mat(Native Method) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at org.opencv.core.Mat.<init>(Mat.java:181) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at com.example.HelloAndroidActivity.onCreate(HelloAndroidActivity.java:15) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.Activity.performCreate(Activity.java:4538) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.ActivityThread.access$600(ActivityThread.java:139) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.os.Looper.loop(Looper.java:154) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at android.app.ActivityThread.main(ActivityThread.java:4977) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-23 09:59:43.835: E/AndroidRuntime(8222):  at dalvik.system.NativeStart.main(Native Method) 

Zwei Dinge zu beachten: Ich bin nicht direkt etwas mit nativen in diesem Code (wie einige andere Fragen hier) und die alte OpenCV 2.3 .x-Bibliothek funktionierte problemlos, bevor die gleiche Methode verwendet wurde. Beide Android-Projekte haben dasselbe Ziel und dieselben unterstützten API-Einstellungen.

+0

wo Sie diese lib "org.opencv.core.Mat" platziert haben. Stellen Sie sicher, dass sich diese JAR-Datei im libs-Ordner befindet. –

+1

Das Hinzufügen dieses Codes hat mein Problem gelöst. 'static {System.loadLibrary (" opencv_java3 "); } ' –

Antwort

19

Ich habe es herausgefunden. Die Bibliothek wurde nicht statisch verknüpft. Wenn Sie diesen Code stattdessen verwenden, funktioniert es.

package com.example; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class HelloAndroidActivity extends Activity 
{ 

    final String TAG = "Hello World"; 

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { 
@Override 
public void onManagerConnected(int status) { 
    switch (status) { 
     case LoaderCallbackInterface.SUCCESS: 
     { 
     Log.i(TAG, "OpenCV loaded successfully"); 
     // Create and set View 
     setContentView(R.layout.main); 
     } break; 
     default: 
     { 
     super.onManagerConnected(status); 
     } break; 
    } 
    } 
}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.i(TAG, "onCreate"); 
    super.onCreate(savedInstanceState); 

    Log.i(TAG, "Trying to load OpenCV library"); 
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) 
    { 
     Log.e(TAG, "Cannot connect to OpenCV Manager"); 
    } 
} 
} 

Allerdings ist diese "OpenCV Manager" Idee nicht so gut. Macht es so, dass der Benutzer mehrere Pakete manuell installieren muss, bevor die App funktioniert.

+0

Mein Problem ist auch das gleiche .. und immer noch mit dem gleichen Fehler kämpfen .. können Sie mir bitte mit mehr Lösungen helfen ??? – Rekha

+1

Haben Sie versucht, meinen Code zu verwenden? – Jason

+1

Nein ich habe nicht versucht, Ihren Code..aber jetzt ist mein Problem gelöst..my Fehler war wirklich vry ​​albern ... das ist ich habe definiert Mat m = neue Mat(), bevor Sie die Bibliothek..so es gab der Fehler..aber es war 2 Tage lang unbemerkt .. – Rekha

3

Die Lösung ist entweder in @Jason Antwort zu tun, die über die Verwendung des OpenCV-Manager ist. Es wird auch sehr ausführlich auf der official documentation here erklärt.

Aber wie @Jason sagt, "Macht es so, dass der Benutzer mehrere Pakete manuell installieren muss, bevor die App funktioniert". Obwohl dies wahr ist, hat OpenCV-Manager einige Vorteile, wie zum Beispiel:

  • Wenn OpenCV aktualisiert wird, muss der Benutzer nur die Manager/Bibliothek aktualisieren. Die Anwendungen, die den Manager verwenden, können gleich bleiben.

  • Ihre App apk Größe wird viel kleiner sein:

    • Eine einfache opencv App wird + für jede App über ~ 400 KB sein ~ 800 KB für OpenCV-Manager + ~ 12MB für die OpenCV-Bibliothek kompiliert für Ihre Gerätearchitektur.
    • Mit der traditionellen statischen Verknüpfung jede einzelne opencv App in Ihrem Gerät wäre mindestens ~ 25MB.
    • Diese Größen hängen vom Kurs abgekommen, auf die Menge an Material, das Sie in Ihrer App platzieren ...

Auch so, wenn Sie Ihre Anwendungen, die traditionelle Art und Weise implementieren wollen, statische Verknüpfung , you can read the instructions here.

+5

"Wenn OpenCV aktualisiert wird, muss der Benutzer nur den Manager/Bibliothek aktualisieren." Das ist wahrscheinlich eine schlechte Sache. Sie möchten die Kontrolle über die von Ihnen verwendete Version behalten, ansonsten gibt es keine Latenzzeit, um zu testen, ob Ihre App mit der neuesten Version funktioniert. Grundlegende QA ... – pablisco

+0

Richtig, ich habe die neuesten Entwicklungen nicht verfolgt, aber es sollte einen Mechanismus für Apps geben, um zu kontrollieren, mit welchem ​​Bereich von Versionen sie kompatibel sind. Wenn nicht, ist das ein Problem. –

+1

Eine weitere Alternative besteht darin, mehrere Ziel-APKs für jede der vier angepeilten CPU-Architekturen zu haben (oder nur eine, x86 und Mips sind nicht so erweitert). Dies ergibt nur einen 4 MB Overhead, was in Ordnung sein sollte. – pablisco

2

Sie können die geöffnete CV-Bibliothek überall in Ihrer Aktivität statisch laden. Durchsuchen Sie die .so-Datei in Ihrem jniLibs-Ordner und kopieren Sie sie als Argument der "loadLibrary" -Methode ohne das lib-Präfix.

Verwandte Themen