- 首先打开Android Studio,新建一个工程,选择Empty Activity, 其他的名字,路径等根据需要自行配置;
- 点击菜单栏的File→New→Import new Module ,如下图所示:
会弹出如下界面:
3.找到你在openCV官网下载的安卓SDK并解压,把解压后的文件夹(我这里是D:\Android\OpenCV-android-sdk\sdk\java )目录下的东西导入 ,这里会让你输入Module的名字,随便什么都行,为了方便还是取名opencv430(430是版本号),而不是网上那一堆垃圾教程说的什么会自动填入名字(自动填入的就是java,一堆垃圾说填入opencvlibrary),这里是手动填入,
输入好名字点击NEXT;
- 接下来你会看到如图所示的界面:
- 三个√全部打上,点击FINISH;
- 然后以Android木查看,你会发现OpenCV的安卓SDK就导入进来了,如下图所示:
- 这里的小绿点表示这是个原始包,还不是Module或者library.
接下来就是配置gradle和复制对应的文件,这才是不要manager的关键,而不是一堆垃圾教程给你说的改个jniLibs就完成了。 - 首先申明一点,对于老司机gradle怎么写怎么配,接下来的东西完全没必要看,剩下的内容针对纯新手,包括我自己。你可能告诉我你照这那一堆垃圾教程也没有manager也跑通了,那你也可以不用看了,以下操作我会精确到每一步,用来记录自己被一堆垃圾教程坑了三天配不好OpenCV without manager的方法
- 首先把项目改成Android目录形式,就是上方那个图,然后找到Gradle Scripts,打开两个grdle,如下图所示:
- 然后再把你解压出来的Android-OpenCV-SDK的SDK下面的gradle文件拖入AS,现在你的代码文件应该有三个,如下图所示:
- 你问我为什么要三个?因为要照着改,不能一股脑的复制,就是这么简单,下面的操作为了简便,我会以app的gradle和430的gradle来指定改那个gradle,而sdk\下面的gradle就是用来指导我们gradle该怎么写的,你一定不要改
- 首先切换到app:gradle选项卡,然后对着gradle430的选项卡右键,选择split vertically如下图所示,当然你也可以选择垂直看个人喜好:
- 随后你的AS界面应该变成了这样:
- 接下来就是一比一的对照修改!!!
- 首先,把430的第一句apply plugin ‘com.android.appcation’ 修改为:
apply plugin ‘com.android.library’ ,一堆坑爹教程根本不会告诉你这里要改成 library,然后你再后面 project struture里一直找不到module(nothing to show),然后你就一脸问号。 - 其次,把android标签开始的内容直到最后一行,复制到430的gradle中,把最后的dependencies删除(这里是删除430的gradle里面的,千万别去删app里面的),把defalutconfig里面的applicationId一行也删除(430里面的,再次强调不是app)然后你的430的gradle应该长这样
apply plugin: 'com.android.library'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
- 然后你可以点一下sync ,免得他在上面不好看,也可以一会配置完了再点,如下图所示:
- 然后把左边的选项卡切换到sdk下面的gradle标签,同样一比一进行对比改,这里就不能直接复制了,要对比着改,有些东西必须要有,有些东西我也不知道是不是必须的,有些语句我也看不懂,本着宁多勿少的原则,我会把我能跑通的都复制进去并写在下面的操作中,现在你的页面应该是这样:
- 首先两个def 和prinln 可复制可不复制,看个人喜好,接着往下看android里面的东西,看到cmake,就知道这里要一比一复制了
- 这一段复制到右边的430gradle中(defaultconfig 里面)
另外看到的 - 这一段也复制进去
然后下面的
只要jniLibs,复制到430中,看到
这里应该明白要把native复制进去,所以把sdk下的native文件夹复制到opencv中src目录下的main文件夹下,这里 也可以复制到其他位置按需修改(记得把项目切换到project模式)
15.然后看到最下面的
就知道要把sdk下面的libcxx_helper复制到430文件夹下,复制进去后你的430文件夹应该是这样:
你的gradle(430)文件应该是这样
apply plugin: 'com.android.library'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared"
targets "opencv_jni_shared"
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
packagingOptions {
doNotStrip '**/*.so' // controlled by OpenCV CMake scripts
}
}
release {
packagingOptions {
doNotStrip '**/*.so' // controlled by OpenCV CMake scripts
}
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['native/libs']
}
}
externalNativeBuild {
cmake {
path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt')
}
}
}
16.然后点击sync.同步一下。successful以后,切换回android目录,发现430下面多了三个柱子如下图:
这个就表示可以进行模块导入了。此时找到工具栏的project struture按钮如下图:
点击它依次选选择Dependencies,app,+,module Dependency
弹出如下界面,打钩,确定
如果你没有改成 library,也没有sync,那么这里就是nothing to show,而那些坑爹教程教你Import Moudle以后就去添加依赖,最终你只能得到noting to show,ok之后选择apply,自动在gradle 里添加implementation project(path: ‘:opencv430’)
17.改完了430的gradle,再来改app的gradle.首先是在defalultconfig添加CMAKE语句:
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
arguments "-DANDROID_STL=c++_shared"
targets "opencv_jni_shared"
}
}
然后在android括号里添加sourcsets
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
你的app下的gradle最终应该是这样:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.byd.facerecognize"
minSdkVersion 24
targetSdkVersion 29
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
arguments "-DANDROID_STL=c++_shared"
targets "opencv_jni_shared"
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation project(path: ':opencv430')
}
这是先不要着急点 sync,先把项目切换到 project目录,在app-src-main把opencv安卓sdk文件下的 sdk\native\libs里的东西复制进去,可根据需要酌情删减,复制的时候顺道改名为jniLibs,如下图:
此时你的文件夹应该长这样,圈出来的地方就是新增的
然后这时候再取点击sync.sync完成后,去点击工具栏的锤子,如图所示:
在编译时,看到如下这句:
就表明正在编译关于so,c++的东西,具体是什么我也不知道,但是一定要出现,并且successful.
至此,完成以后。你就可以使用opencv里面所有的方法和函数了,由于其他原因,这里就不移植官方demo并展示了(硬件,权限,等等不允许)。
PS:
由于每次这样导入很麻烦,因此在附上一个将OpenCV打包jar包的方法:
<1>.首先点击右边的gradle,如图所示:
<2>.依次选择430,other,如图所示
<3>.找到create full jar debug (或者release),如图:
双击任意一个运行,运行完成后,改为project视图,在opencv430-bulid-intermediates-full_jar-debug下找到full_jar文件,如图所示
<4>.把full_jar复制到app项目的libs下,如图所示:
右键full.jar,add as a library,如图
点击ok
然后你就可以使用opencv中的Java接口,不用每次都Import Module了,如图
至此配置就全部结束了。之所以在网上写了那么多相关配置方法后,还选择写这样一篇文章,主要还是记录下自己的踩坑过程。
当然了,网上那些教程也没有必要写的那么详细,也没有必要教你,只是自己配置个环境配了三天,各种文章翻烂了也没配置好,才会在文章中使用一些过激言论,决定自己写
也许你看了我的文章也会有问题,可以在下面留言,我会尽力解答。也有可能你还是配置不好Android的OpenCV环境,也许我给你解答了你还是配置不好,那么就需要你自己有点工程能力,去排查错误了。
没有一篇文章是万能的,只有靠自己的工程能力,去一点点排查错误,才能成功。这件事最终带来的喜悦一定远远超过一顿猪脚饭。