脱离OpenCV Manager
做为OpenCV4Android的系列博客,本文将给出一个打包OpenCV API到APK使Android应用脱离OpenCV-Manager的例子。
首先依然强调一点:不要盲目相信任何“大神”的博客,官方文档才是最佳的参考资料。
关于脱离OpenCV Manager的方法,官方文档给出了一个解决方案,链接如下:
具体操作方法,我们从Application Development with Static Initilalization部分开始阅读就好。
下面,给出我的实践例子:
Android.mk文件部分:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
#OPENCV_LIB_TYPE:=SHARED
OPENCV_LIB_TYPE:=STATIC
include ../sdk/native/jni/OpenCV.mk
#include E:/OpenCV-2.4.10-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := GetString.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE :=helloJNI
include $(BUILD_SHARED_LIBRARY)
这里我遇到的问题是,include时使用绝对路径时cygwin会报如下错误:
这个问题纠结了很久,最后在stackoverflow上找到了解决方案:把绝对路径改成相对路径,编译成功时也着实无语。
stackoverflow链接:http://stackoverflow.com/questions/601516/cygwin-make-error-target-pattern-contains-no
主文件部分(加载So库):
public class MainActivity extends ActionBarActivity implements OnClickListener {
private TextView mTextView;
private ImageView imageView;
private Bitmap bmp;
private Button btnProc;
static {
if (!OpenCVLoader.initDebug()) {
}
System.loadLibrary("helloJNI");
}
……
}
简单的说,就是用OpenCVLoader.initDebug()替代了OpenCVLoader.initAsync(),给出测试结果如下:
1、卸载OpenCV Manager后使用penCVLoader.initAsync()的APK,无法启动
2、脱离OpenCV Manager的APK
3、调用JNI方法处理图像