使用opencv有两种方式:
一种是使用opencv的java版本的API,但是这种方式不是通过本地调用实现的,全部都是java代码。
一种是使用opencv的c++版本的API,将本地c++代码编译成.so链接库,然后在安卓开发中进行调用,本地cpp代码使用NDK进行编译。
这里总结下面这种编译本地c++代码的实例流程:
1、新建android项目,项目名称命名为NDKdemo。
2、修改界面文件res->layout->activity_ndkdemo.xml
3、在文件夹src下的com.example.ndkdemo包中新建一个类,类名为NdkFun。
这个类用于包装使用了opencv
c++代码的动态库的导出函数。
4、修改Ndkdemo.java的代码,主要编写界面,以及调用上面的类(即使用C++动态库)。
上面都是在android开发环境上的java代码。
5、在项目中新建一个jni文件,用于放置该项目的所有cpp代码。
在jni文件夹下建立一个与动态库相同名字的cpp文件。
主要编写功能实现,完成逻辑,C++代码。
6、然后再在jni下新建两个文件"Android.mk"文件和"Application.mk"文件,这两个文件事实上就是简单的Makefile文件。
使用NDK进行编译的时候,需要使用Android.mk和Application.mk两个文件。
以上编写C++代码,以及makefile文件。
7、编译本地C++代码
编译本地C++代码可以使用Cygwin进行编译,cd 到项目目录,然后运行ndk-build。
也可以使用windows控制台进行编译,同样cd到项目目录,运行ndk-build。
还可以使用Eclipse进行编译,建议配置使用Eclipse进行编译,这样当项目的本地cpp代码发生变化的时候就可以实现自动的cpp代码编译,不用每次都在命令行中手动的进行编译。
我们使用Eclipse进行编译:
7.1首先需要将该项目转换到C++项目,使得该项目具有C++代码属性,如下所述。
点击项目,右击,New -> Other -> C/C++ -> Convert to a C/C++ Project.
7.2配置Eclipse对cpp代码进行编译:
首先需要给当前项目添加一个编译环境变量,如下目录
open Eclipse menu Window -> Preferences -> C/C++ -> Build -> Environment,
点击Add... 添加一个NDKROOT,并且设置值为NDK的根目录。
然后设置编译的一些参数
Project Properties -> C/C++ Build, uncheck Use default build command, replace “Build command” text from "make" to
"${NDKROOT}/ndk-build.cmd" on Windows,
"${NDKROOT}/ndk-build" on Linux and MacOS.
然后修改Behaviour选项卡,设置编译配置(配置在保存代码的时候进行自动编译):
点击确定,然后确认NDK(ndk-build)编译能够正常进行编译:
这个时候,会在C++代码中,看到非常多的错误提示,遍地都是错误提示,这里不要慌,这里只是假的错误提示,编译cpp代码能够编译通过,但是运行程序是不行的,会提示你代码有错误,需要解决这些问题。
打开工程属性,Project Properties -> C/C++ General -> Paths and Symbols
为GNC C++编译器添加如下路径:(这里添加的路径就是NDK 中的c/c++ 头文件的路径以及要让项目找到opencv的jni的目录,这样才能使用opencv的c/c++ 对应的头文件。)
终于可以运行程序了。