1.目标和步骤
(1)环境搭建
(1.1)ndk环境---走进AndroidStudio下的NDK
问题1:发现mk文件没有自动生成(如果不想手动写mk,可以做如下替换)
在项目的主目录下./build.gradle替换build tools,使用gradle-experimental,如下
classpath"com.android.tools.build:gradle-experimental:0.7.0-alpha4"
替换插件
在gradle中不能再使用com.android.application了,需要使用com.android.model.application替代。
在项目主目录下的./app/build.gradle中更改plugin
apply plugin: “com.android.model.application”
相应的gradle配置的依赖版本要改成2.10.0
可以参考 http://android.jobbole.com/83431/,但是我不想改我的gradle版本
我的解决方法:手工执行命令经行编译,学习一下mk
在使用手工编译(C/C++)文件之前,我们要回到文章开头部分,我们需要配置好系统环境变量,这样我们才能在系统环境下执行ndk相关编译命令,如果您的环境变量还没有配置,那么可以参考下文章开头部分,如果已经做好这部分工作,那么咱们继续。
接下来,我们还要创建如下两个文件:Android.mk 和 Applicatoin.mk (非必要)
创建Android.mk
Android.mk文件用来指定源码编译的配置信息,例如工作目录,编译模块的名称,参与编译的文件等,大致内容如下:
LOCAL_PATH:= $(call my-dir)include$(CLEAR_VARS)LOCAL_MODULE:= hello_jniLOCAL_SRC_FILES:= hello_jni.cinclude$(BUILD_SHARED_LIBRARY)
LOCAL_PATH:设置工作目录,而my-dir则会返回Android.mk文件所在的目录。
CLEAR——VARS:清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)。
LOCAL_MODULE:用来设置模块的名称。
LOCAL_SRC_FILES:用来指定参与模块编译的C/C++源文件名。
BUILD_SHARED_LIBRARY:作用是指定生成的静态库或者共享库在运行时依赖的共享库模块列表。
创建Application.mk
这个文件用来配置编译平台相关内容,我们最常用的估计只是APP_ABI字段,它用来指定我们需要基于哪些CPU架构的.so文件,当然你可以配置多个平台:
APP_ABI := armeabi armeabi-v7a x86 mips
如果不创建Application.mk文件,那么手动编译的.so文件只有armeabi平台一个版本,其他平台的不会被编译。
假设我们配置好了Android.mk文件,那么接下来我们就可以执行如下命令来生成.so文件了,我们假设开发NDK的目录为默认目录:
cdsrc/main/jni/ndk-build
如果顺利,那么你将会看到,在src/main/目录下会多了一个libs目录,这是NDK使用命令编译.so文件的生成的默认目录,而AndroidSutdio默认加载NDK的目录是jniLibs,那么你有两种解决方式:
配置build.gradle资源目录,参见文章2.1小节
使用ndk-build NDK_LIBS_OUT=../jniLibs指定具体的输出目录
当你得到了.so文件,那么接下来就是在java文件中调用执行即可,如果想了解更多ndk-build命令内容,可参见:Android ndk-build 使用文档
(1.2)opencv环境
这篇文章基本能解决大部分问题
这篇文章绝对手把手教会
Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库
介绍了用CMake构建的方法,用的版本和库比较新
到了这一步,应该都能成功的配置出NDK环境并在上面使用opencv的接口。
2.编译Opencv源码及生成android工程
经过上面的步骤可以完成openCV环境的搭建,用C/C++或者java开发OpenCV的程序没什么大问题了,基于的库是openCv的主干版本,问题是我们想加入扩展包的物体追踪的内容构建。
openCV的扩展包地址如下:
https://github.com/opencv/opencv_contrib
如何将扩展包和主干编译到一起,我到开源库中提了问题
看到在官方的构建中是有将opencv和contrib工程集体打包的构建,但是并没有公开出来,然并卵!
在本地如何整体编译,有这个问题可以得到解答。
按照tzutalin那个哥们说法:(2)中build-opencv-for-android这个可以解决问题。估计在linux平台上是可以的,我这里用的是
mac,编译会遇到各种坑,最后采用的是(1)中的方法
(1)下载opencv源码和opencv_contrib源码
midir opencvProject
cd opencvProject/
git clone https://github.com/opencv/opencv_contrib.git
git clone https://github.com/opencv/opencv.git
(2)用Cmake进行编译
额没有下载cmake, 先下载安装cmake, 推荐使用brew工具下载安装
cd opencv
mkdir release
cd release
cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/CMAKE_BUILD_TYPE=RELEASE - DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j8
sudo make install
等吧,我们不缺时间不要优化
(3)编译生成Android工程
回到opencvProject这个目录,看到里面有下好了的俩个工程opencv和opencv_contrib
下载这位哥写好的脚本进行编译
git clone https://github.com/tzutalin/build-opencv-for-android.git
./build-android-opencv.sh
编译的时候遇到一个错误,readlink: illegal option -- f,解决方案是这篇文章
然后把脚本中的readlink改为greadlink,
### ABIs setup中把armeabi-v7a with NEON加上,这样可以生成不同系统对应的so库
declare -a ANDROID_ABI_LIST=("x86" "x86_64" "armeabi" "armeabi-v7a with NEON")
再次运行,OK了
3.使用
编译出来生成android_opencv的文件夹工程,使用方法和2种讲的一致。
网友评论
如错如下:
CMake Error at /home/bnhc/OpenCV/Test/build-opencv-for-android/android-cmake/android.toolchain.cmake:308 (file):
file STRINGS file
"/home/bnhc/Android/Sdk/ndk-bundle/platforms/android-21/arch-arm/usr/include/android/api-level.h"
cannot be read.
这个文件api-level.h我没有找见,提示不能read.
make: *** No targets specified and no makefile found. Stop.
make: *** No rule to make target 'install/strip'. Stop.
end building armeabi-v7a with NEON version
不熟悉Cmaked的规则,还在学习中.您帮我看下这是什么问题导致的.谢谢.