2012-07-23 2 views
14

просто пытается сделать простую программу для Android openCV. Загрузили и установили OpenCV для Android после instructions here и добавили OpenCV Library 2.4.2 в качестве проекта библиотеки для моего собственного проекта Android, такого как состояние инструкций.Android UnsatisfiedLinkError с OpenCV 2.4.2

Однако, когда я компилирую стандартную программу «Hello World Program», следующим образом, не удается, если я включаю строку Mat mat = new Mat();, но в противном случае это не удастся.

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(); 
    } 
} 

Вот трассировки стека он печатает:

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) 

Две вещи, чтобы отметить: я прямо не используя ничего родного в этом коде (как и некоторые другие вопросы, на здесь) и старый OpenCV 2,3 .x работала отлично, прежде чем использовать тот же метод. Оба Android-проекта имеют одинаковые целевые и поддерживаемые параметры API.

+0

где вы разместили этот lib "org.opencv.core.Mat". убедитесь, что этот файл jar находится в папке libs. –

+1

Добавление этого кода разрешило мою проблему. 'static {System.loadLibrary (" opencv_java3 "); } ' –

ответ

19

Выяснил это. Не статически связывала библиотеку. Если вы используете этот код, он работает.

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"); 
    } 
} 
} 

Однако не слишком увлекайтесь этой идеей «OpenCV Manager». Делает это так, что пользователь должен установить несколько пакетов вручную, прежде чем приложение будет работать.

+0

Моя проблема тоже такая же ... и все еще борется с той же ошибкой. Не могли бы вы помочь мне с большим количеством решений ??? – Rekha

+1

Вы пытались использовать мой код? – Jason

+1

Нет, я еще не пробовал ваш код ... но теперь моя проблема решена. Моя ошибка была действительно противной глупостью ... то есть я определил Mat m = new Mat(), прежде чем позвонить в библиотеку. ошибка..Но это было незаметно в течение 2 дней .. – Rekha

3

Решение состоит в том, чтобы либо сделать, как в ответе @Jason, который посвящен использованию OpenCV Manager. Это также подробно объясняется на official documentation here.

Но, как @Jason говорит: «Делает так, что пользователь должен установить отдельные пакеты вручную до того, как приложение будет работать». Хотя это правда, OpenCV менеджер имеет некоторые преимущества, такие как, например:

  • Если OpenCV обновляется, пользователю необходимо только обновить менеджер/библиотеку. Приложения, которые используют диспетчер, могут оставаться неизменными.

  • Ваш размер приложения APK будет намного меньше:

    • Простой OpenCV приложение будет около ~ 400KB для каждого приложения + ~ 800KB для OpenCV менеджера + ~ 12MB для библиотеки OpenCV скомпилирован для вашей архитектуры устройства.
    • С традиционным статическим связыванием каждый приложение opencv на вашем устройстве должно быть не менее ~ 25 МБ.
    • Эти размеры зависят, от курса, от количества материала, который Вы размещаете внутри вашего приложения ...

Тем не менее, если вы хотите, чтобы развернуть свои приложения традиционным способом, статического связывания , you can read the instructions here.

+5

«Если OpenCV обновлен, пользователю нужно только обновить менеджер/библиотеку». Это, наверное, плохо. Вы хотите сохранить контроль над версией, которую используете, иначе нет времени ожидания, чтобы проверить, работает ли ваше приложение с последней версией. Базовый QA ... – pablisco

+0

Верно, что я не следил за последними событиями, но должен быть механизм для приложений, для управления которыми диапазон версий, с которыми они совместимы. Если нет, это проблема. –

+1

Другой альтернативой является наличие нескольких целевых APK для каждой из 4 целевых архивных архитектур (или только один, x86 и mips не являются такими расширенными). Это дает только 4 МБ, что должно быть хорошо. – pablisco

2
static{System.loadLibrary("opencv_java3"); } //the name of the .so file, without the 'lib' prefix 

Вы можете статически загружать открытую библиотеку cv всюду в своей деятельности. Найдите файл .so в папке jniLibs и скопируйте его в качестве аргумента метода loadLibrary без префикса lib.

Смежные вопросы