2012-07-23 16 views
14

単純なopenCVアンドロイドプログラムをやろうとしています。 instructions hereに続いてAndroid用のOpenCVをダウンロードしてインストールし、OpenCVライブラリ2.4.2を自分のアンドロイドプロジェクト用のライブラリプロジェクトとして指示状態のように追加しました。Android UnsatisfiedLinkError with OpenCV 2.4.2

しかし、標準の "Hello World Program"を次のようにコンパイルすると、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) 

2つのことに注意する:私は直接(ここにいくつかの他の質問のように)このコードではネイティブのものを使用していないですし、古いOpenCVの2.3ここで

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

は、プリントアウトし、スタックトレースです.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

いいえ私はあなたのコードを試していません..しかし、今私の問題は解決されました。私の間違いは本当に愚かなvryです...私はMat m = new Mat()を定義しました。 2時間は目立たなかった。 – Rekha

3

解決策は、OpenCV Managerを使用している@ Jason回答のようにすることです。それはまた、official documentation hereで非常に詳細に説明されています。

@Jasonと同様に、「アプリケーションが動作するには、手動でパッケージを手動でインストールする必要があります」と述べています。これは本当ですが、OpenCVのマネージャーは、例えばのようないくつかの利点があります。OpenCVのが更新されると

  • 、ユーザーは管理者/ライブラリを更新する必要があります。マネージャを使用するアプリケーションは同じままです。

  • アプリのAPKのサイズがたくさん小さくなります。

    • 簡単なOpenCVのアプリは、アプリごと〜400キロバイト程度になります+〜OpenCVのマネージャーのための800キロバイト+〜OpenCVのライブラリーのための12メガバイトあなたのデバイスアーキテクチャ用にコンパイルされています。
    • 伝統的な静的リンクあなたのデバイスのすべての opencvアプリは少なくとも〜25MBになります。あなたはアプリを結ぶ、静的な伝統的な方法を展開したい場合
    • これらのサイズは、たとえそうであっても...アプリ内に置くものの量に、コースを外れ、

に依存します、you can read the instructions here

+5

"OpenCVが更新された場合、ユーザーはマネージャー/ライブラリを更新するだけです。"それはおそらく悪いことです。 使用しているバージョンを管理したい場合は、アプリが最新バージョンで動作するかどうかをテストするための待ち時間がありません。 ...基本的なQA ... – pablisco

+0

真実、私は最近の開発に従っていませんが、互換性のあるバージョンの範囲をアプリが制御する仕組みが必要です。そうでなければ、それは問題です。 –

+1

もう1つの選択肢は、4つのターゲットとされたCPUアーキテクチャのそれぞれに対して複数のターゲットAPKを持つことです(またはx86とmipsは1つだけ拡張されます)。これは4MBのオーバヘッドしか与えません。これは大丈夫です。 – pablisco

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

オープンcvライブラリをアクティビティのあらゆる場所に静的にロードできます。 jniLibsフォルダの.soファイルを検索し、lib接頭辞なしで "loadLibrary"メソッドの引数としてコピー/貼り付けします。

関連する問題