相信初学者(正是在下没错了)在学习OpenCV时,时常会一顿操作猛如虎,一跑起来。。。。。嗯?还要我安装附加的Manager App?也就是这句话—–
Opencv manager package was not found
想了想自己研究的时候装个Manager也到无所谓,可是当需要发布应用时,总不能让人家也去安装吧,于是一顿寻找之下,发现网上大多都是照着Demo直接写
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, loaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
loaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
经实测直接这样写根本不行,于是我去看initDebug中的逻辑,发现需要加载静态so文件才能完成这种情况下的初始化。我顺其自然的就去看官方的demo,发现用的是老的构建方法,也就是通过编辑Android.mk Application.mk 来实现。出于与时俱进的想法,我决定用CMakeList的方式来实现so文件的加载。(至于把OpenCV引入项目的方法以及具体的逻辑实现就不说了,网上有很多,不懂的大家自己做功课吧)
1. 拷贝so文件到libs目录
首先是将sdk/native/libs下对应架构的so文件复制到项目的libs文件夹下(准确的来说是需要移到JniLibs目录下的,不然会遇到读不到的情况,当然也可以通过将libs指定为JniLib的方式的实现,这个问题也是老生常谈了,具体代码就不贴了,网上很多相关代码)。
2. 修改CmakeList文件
接着是修改CmakeList文件,这个文件在初始化NDK项目时会自动生成,我们只需要在原有基础上修改即可,具体使用方法可参考官方文档。
我们首先添加
add_library(
opencv_java3
SHARED
IMPORTED
)
set_target_properties(
opencv_java3
PROPERTIES IMPORTED_LOCATION
${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libopencv_java3.so
)
这里大家应该能猜到大概意思,就是添加一个新的库,并制定目标的所在位置,这里的${ANDROID_ABI}指的是相应的架构,具体支持哪些架构要看复制了哪些架构的so文件,同时记得要在build.gradle里配置abiFilters哦,这里也就不展开了。
PS:我这里使用的是Module目录下的libs文件夹,大家在使用时需根据实际情况进行修改。
接着在target_link_libraries中加入刚刚添加的库,不然编译打包时会打不进去库
target_link_libraries( # Specifies the target library.
native-lib
opencv_java3
# Links the target library to the log library
# included in the NDK.
${log-lib}
)
3. 检查apk包中是否已经将相关库打包
最后我们编译运行项目(具体使用逻辑可以先不加,主要看是否初始化成功了)在app模块的/build/outputs/apk/debug下双击app-debug.apk文件,如果看到相关库已经打进去了,那么就证明成功了,也就不会出现一开始那个Manager的弹窗了。
本人也是第一次写这样的文章,实属是个萌新,有不正确的地方也请各位大佬指出!!!总之还是希望能给到大家一些帮助,因为这方面的资料和案例很少,所以自己在研究的时候也感觉到有些痛苦,所以这次特地记录下来分享给大家。