2016-06-23 19 views
0

私は奇妙な問題に遭遇しました。短いものを維持するには、次のActivity2は割り当て意向により、現在のフレームのアドレスを送信Android + OpenCVのSIGSEGV

Activity1プレビューフロントカメラとユーザーのクリックでActivity2を開始:私は2つの活動でのOpenCVを利用してAndroidアプリを書きました指定されたアドレスのフレームのMatクローン型のローカルフィールドであり、ユーザーはそれを簡単に操作できます(つまり、HSV色空間でinRangeメソッドを実行する)。 MatはImageViewに表示されたBitmapに変換されます。これはActivity2の開始時(元のキャプチャされたフレームの場合)およびSeekBarの各ユーザが操作した後に発生します。

Activity1はActivity2の親です。したがって、BackボタンをクリックするとActivity1が再開されます。 そして今は奇妙な部分(複数可)来る:libc: Fatal signal 11 (SIGSEGV)

1)いくつかの時間後(1分未満)Activity1クラッシュを、 - Activity2が開始されることはありませんときに、それが起こらない想像できるよう

2)単にアクティビティ1に戻って再度クリックしてActivity2を再起動した場合、OnCreate()や他のメソッドが呼び出され、MatからBitmapへの変換が実行されたときに同じ致命的なシグナルエラーでアプリケーションがクラッシュする:

Utils.matToBitmap(mCapturedFrame, bm); 

だから、 eアクティビティを再起動した後、OpenCVの関数が呼び出されています。最良の部分は、mCapturedFrame exsistsであり、上記の方法は、OpenCVライブラリをロードした後にと呼ばれます。さらに、私はローカルで作成されたMatsと、キャプチャされたフレームMatを含むフィールド(Activity2から戻るとき)をrelease()します。エラーは、Activity1の場合はメモリリークのように見えますが、どこですか?

私がここで間違っていることを本当に見ることができず、何か提案がありがたくなるでしょう。 http://speedy.sh/RMPKH/thesis.zip

答えて

1

私がこれを正しく理解していれば、マットのネイティブオブジェクトアドレスをアクティビティ1からアクティビティ2に送信しています。そして、アクティビティ2で、あなたがやっていることをしています。

Mat receivingMat = new Mat(nativeAddrFromActivity1); 

この場合、問題は2重のエラーが発生していることです。この理由は自明ではありませんが、私はあなたを歩いて行きます。最初のは、そのコンストラクタのOpenCVののマットの実装に見てみましょう:もちろん

public Mat(long addr) 
{ 
    if (addr == 0) 
     throw new java.lang.UnsupportedOperationException("Native object address is NULL"); 
    nativeObj = addr; 
} 

、receivingMatは、スコープのうち、将来の実行のある時点でとGarbageCollectorによって収集されます。この場合、finalizeメソッドが呼び出されます。

@Override 
protected void finalize() throws Throwable { 
    n_delete(nativeObj); 
    super.finalize(); 
} 

次のようにn_delete関数は(see here)に定義されています:

// 
// native support for java finalize() 
// static void Mat::n_delete(__int64 self) 
// 

JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1delete 
    (JNIEnv*, jclass, jlong self); 

JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1delete 
    (JNIEnv*, jclass, jlong self) 
{ 
    delete (Mat*) self; 
} 

から、次のようにfinalizeメソッドが実装されているので、これは、OpenCVののマット実装のネイティブ削除機能の呼び出しになり私の見解では、これはAndroid用OpenCVのバグです。ネイティブアドレスコンストラクタで作成されたMatは、ネイティブMatヘッダの所有権を持たないため、n_delete関数を呼び出すべきではありません。私は、あなたの代わりにビットマップにマットを変換する必要があり、


はあなたの問題を解決するために...あなたは、この動作をしたいと思いますどのような場合を考えて、一時ファイルに保存し、そのファイルへのパスを送信することはできません。アクティビティ1からアクティビティ2まで、インテントエクストラを介して

+0

ありがとうございます。申し訳ありません、私はとても遅く書いています。不幸にも、ソリューションが機能するかどうかを確認することはできませんが、分析したところで問題はないようです。 私は、ボタンの機能を無効にすることで問題を処理しました(アクティビティXML設定から「親アクティビティ」プロパティを削除しました)。 – przemulala