1

私は無数のリソースを調べました ( OpenCV4Android の Google グループ、StackOverflow、OpenCV の回答ページなど、これを解決しようとして、提案が冗長になるポイントに到達しました。この問題は、以前の (まだ解決されていません)私の質問ですが、状況が異なるため、おそらく別のエラーの原因です。

正常に実行されているアプリを含むパッケージに Android アクティビティを追加しました (ndk の使用を示す OpenCV のチュートリアル 3 サンプル)。アクティビティは OpenCV の Java API を使用しますが、ネイティブ ライブラリを表すSystem.loadLibrary("nativefile");whereへの呼び出しがあります。が呼び出されるnativefileブロックを以下に示します。loadLibraryそれはonManagerConnected()方法にあります。このloadLibrary行で、Logcat は以下を出力します。

02-17 19:27:39.239: E/AndroidRuntime(10872): FATAL EXCEPTION: main
02-17 19:27:39.239: E/AndroidRuntime(10872): java.lang.UnsatisfiedLinkError: Library nativefile not found
02-17 19:27:39.239: E/AndroidRuntime(10872):    at java.lang.Runtime.loadLibrary(Runtime.java:461)
02-17 19:27:39.239: E/AndroidRuntime(10872):    at java.lang.System.loadLibrary(System.java:557)

このようなエラーは、他の質問で実際に複数回発生しました。私は出くわした提案を試しました。ただし、この問題には注目すべき観察事項があります。正常に実行されるアプリ (OpenCV サンプル) は、 を介して同じライブラリを呼び出しますSystem.loadLibrary("nativefile");

コードはかなり長いため、質問に配置するのには役立ちません。ただし、以下は、問題に関する重要な要素であると私が推測するものを要約したものであり、問​​題に関連する以前の回答の一部も要約しています。

  • 呼び出された .cpp ファイルには正しいメソッド名が含まれており、パッケージ名、クラス名、およびメソッド名が次のようなパターンで含まれていることを確認しますJava_packageNameSeperatedWithUnderScores_callingClassName_methodName。さらに; extern "C"ネイティブ開発用の他の OpenCV サンプル cpp ファイルと同様に、コードはブロック内に囲まれています。
  • Android マニフェストが更新され、問題のアクティビティを起動することがわかります。
  • 以下はAndroid.mkファイルです:

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
    include ../../sdk/native/jni/OpenCV.mk LOCAL_MODULE := nativefile
    LOCAL_SRC_FILES := nativefile.cpp
    LOCAL_LDLIBS += -llog -ldl
    include $(BUILD_SHARED_LIBRARY)

  • 以下はApplication.mkファイルです

    APP_STL := gnustl_static
    APP_CPPFLAGS := -frtti -fexceptions
    APP_ABI := all

  • 行を で置き換えてみましallたが、 でもう一度試しましたが、結果は変わりませんでした。APP_ABIarmeabiarmeabi-v7a

  • ここのコメントで示唆されているように、apk (抽出後) には、さまざまなアーキテクチャ タイプのフォルダーの下のフォルダーに必要な.soファイルが含まれていることも確認しました。lib
  • 以下はBaseLoaderCallBackインスタンス化ブロックで、OpenCV サンプルとあまり変わりませんが、アプリは SD カードから読み取った画像に対して画像処理を実行するため、OpenCV カメラは呼び出しません。

     BaseLoaderCallback loader = new BaseLoaderCallback(this){
     public void onManagerConnected(int status){  
        switch(status){     
            case LoaderCallbackInterface.SUCCESS:{ 
                 System.loadLibrary("nativefile"); break; }  
            default:{  
                 super.onManagerConnected(status); break; }  
        } } };
    
  • ただし、OpenCV のサンプルとは異なり、問題のアクティビティでは、メソッドが他の方法で呼び出されていないように見えるため、行がメソッドにloader.onManagerConnected(LoaderCallbackInterface.SUCCESS);追加されます。onCreate()onManagerConnected

  • ステートメントのすべての OpenCV ブロックの前に、条件if (OpenCVLoader.initDebug())がチェックされます。推奨される 条件チェックも試しましたOpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, loader)が、それでも結果は変わりません。
  • また、ndk-build が正常に実行さ.soれ、ネイティブ ライブラリのファイルがビルドされますnativefile

同じパッケージ内の他のアクティビティがライブラリをロードし、それを細かく利用することを考えると (もちろん、それに応じてマニフェスト ファイルと cpp メソッド名を修正した後)、プロジェクトのプロパティは正しいと思います (OpenCV ライブラリの追加、必要な環境など)。パスなど)。

私は OpenCV のサンプルを何度もレビューし、上記で詳述したように、わずかな違いを除いて同じ方法に従いました。

問題の原因は何ですか?

お時間をいただきありがとうございます。

4

0 に答える 0