前一段时间公司项目要用到OpenCV的东西做图像处理,但是一般都要安装OpenCV的apk包才能正常使用(估计是要导入那些os库)
但是老板认为自己的apk安装之后,还要装别的apk,显得很菜,要求不安装OpenCV的apk
没有办法,只能安装老板说的来做.(只是想吐槽一下)自己以前在上大学的时候接触过一点点的C++.
在网上找了很多资料,OpenCV使用C代码来写的,源代码也下载下来了(文章最后会贴上OpenCV源代码的下载)
因为都是C的源码,,于是就想到,可以用NDK来调用.
说干就干吧,解压OpenCV的源码后,可以看到
1.
幸好里面有个sample,,估计就是例子,打开之后
2.
看了很久,这个face-detection里面就是直接调用源代码,不需要安装apk,也调用到JNI了.
于是乎............哈哈
自己本来对MK文件也不是特别的熟悉,,就拿这个项目的MK文件直接修改了,(face-detection/jni/Android.mk),里面Android.mk源文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off >>>>>如果这个设置为off产生很多os库,,设置为on只产生一个os库
#OPENCV_LIB_TYPE:=SHARED
include ../../sdk/native/jni/OpenCV.mk >>>>这里是OpenCV源码C的路径里面的Mk文件
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
然后在自己的项目里面配置NDK,,具体配置NDK的方法的话,网上有很多,,根据自己的需要配置NDK版本
然后在自己的工程下面新建一个jni的文件夹
把这4个文件全部都考进去
修改Android。mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=off
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
#OPENCV_LIB_TYPE:=STATIC
include ../sdk/native/jni/OpenCV.mk =====>>>>>这个是关联源码的文件,我是吧OpenCV的sdk文件复制到了我的项目同一个目录下面,,,这个看情况修改
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
源码文件就是OpenCV包里面的sdk文件的目录
然后clean一下项目,,自动回生成jar包.然后使用跟以前一样.
注意注意:在加载OpenCV的时候不一样,看代码
<span style="font-size:12px;">@Override
protected void onResume() {
super.onResume();
// OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10,this, mLoaderCallback);
// System.out.println(1);
//
// System.load("/system/lib/libnative_camera_r4.4.0.so");
// System.load("/system/lib/libopencv_dynamicuda.so");
// System.load("/system/lib/libopencv_info.so");
// System.load("/system/lib/libopencv_java.so");
// System.load("/system/lib/libOpenCVEngine_jni.so");
// System.load("/system/lib/libOpenCVEngine.so");
if(OpenCVLoader.initDebug()){
handler.sendEmptyMessage(HandlerWhatLib.LOAD_OPENCV_FINISH);
}
}</span>
就是加载不一样,加载过程,在文档上说最好在onresume里面加载,好了就可以尽情的享用了.
最后,不好意思opencv源码文件太大,传不上来,大家可以百度去下载.