首先說一點我用的是比較新的opencv版本。
回到正題,爲啥會出現這個問題呢,先看幾段代碼。
@Override
protected void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
這個是例子中的代碼,進入initDebug 方法,然後進入
StaticHelper.initOpenCV(false);
正常會有一個log輸出
First attempt to load libs fails 就是告訴我們 首次嘗試加載libs失敗 然後返回false.
所以我們會執行到這段代碼
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
然後來到了 initOpenCV -----> InstallService(AppContext, Callback);
好了,問題就是在這裏暴露出來的,進入
getPackageName方法,會看到提示我們報錯的dialog
這個就是提示錯誤彈出的地方,那爲什麼會出現呢,上面我們其實已經給出了答案: 首次嘗試加載libs失敗。
因爲我之前有編譯成功的,拷貝了一份就編譯不成功了,感覺太奇怪了,我就把原來的apk拿來分析了一下,果然原來的包比現在包多了一個libs ,大小多出來近60mb ,其他的都一樣。
可以正常使用的包:
報openCV OpenCV Manager package was not found! Try to install it? 的包:
那麼這個lib 是放在那裏,又從那裏來呢?
這個就在我們下載的opencv sdk 裏邊,
這裏我改了名字,原來名字就叫sdk ,我這裏將我不需要的兩個架構包刪除了,把so 放進去就可以正常使用了。
當然,我這個是我自己在拷貝 opencv sdk 等操作過程中 將so 丟失才暴露出來的bug ,正常情況下應該不會出現這個問題,還有就是sdk 這個依賴庫的名字儘量不要改,如果你改了你會發現使用官方給的幾個事例時候有的ndk 會報錯,找不到so 包,如果改了,那你就要修改相關配置的目錄了。