私は無数のリソースを調べました ( 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_ABI
armeabi
armeabi-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 のサンプルを何度もレビューし、上記で詳述したように、わずかな違いを除いて同じ方法に従いました。
問題の原因は何ですか?
お時間をいただきありがとうございます。