在MAC-Adroidstudio中使用OpenCV
首先,要检查JDK和NDK等有没有安装好,没有安装好的话赶快去官网上下吧~~,欧对了,,我的AS貌似是1.5版本的。准备工作做好之后就可以开始辣~
把OpenCV中的native文件放到新建工程的最低层文件夹中,就像这样哈
然后新建Jni目录,也是像这样哈~
在Jni中新建两个文件夹,就像这样~
编辑gradle.properties文件,增加下面的属性使用旧版的ndk功能(不添加会使用实验性的ndk构建工具
android.useDeprecatedNdk=true
在local.properties文件中配置ndk目录
ndk.dir=ndk.dir=/Users/orekinana/Downloads/Android/android-ndk-r11b
编辑build.gradle,在android节点中增加下面的代码
sourceSets.main.jni.srcDirs = []
//禁止自带的ndk功能
sourceSets.main.jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs']
//重定向so目录为src/main/libs和src/main/jniLibs,原来为src/main/jniLibs
task ndkBuild(type: Exec, description: 'Compile JNI source with NDK') {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkDir = properties.getProperty('ndk.dir')
if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {
commandLine "$ndkDir/ndk-build.cmd", '-C', file('src/main/jni').absolutePath
} else {
commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
task ndkClean(type: Exec, description: 'Clean NDK Binaries') {
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkDir = properties.getProperty('ndk.dir')
if (org.apache.tools.ant.taskdefs.condition.Os.isFamily(org.apache.tools.ant.taskdefs.condition.Os.FAMILY_WINDOWS)) {
commandLine "$ndkDir/ndk-build.cmd",'clean', '-C', file('src/main/jni').absolutePath
} else {
commandLine "$ndkDir/ndk-build",'clean', '-C', file('src/main/jni').absolutePath
}
}
clean.dependsOn 'ndkClean'
在之前新建的Application.mk中增加下面的内容
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8
在Android.mk中增加下面的内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OpenCV_INSTALL_MODULES := on
OpenCV_CAMERA_MODULES := off
OPENCV_LIB_TYPE :=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include ..\..\..\..\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_MODULE := OpenCV
LOCAL_SRC_FILES :=
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
这时候,使用gradle构建一下,如果能成功构建出so,说明配置没问题,如下图,点击as右侧的gradle展开,双击ndkBuild进行构建
声明java层的native方法(这里就是随便写了一个add的方法,实际用的时候按照需求写哈)
public class OpenCVHelper {
static {
System.loadLibrary("OpenCV");
}
public static native int[] add(int a, int b);
}
然后就是我当时最头疼的命令了,首先,打开终端,先进入到你的工程文件中的app目录下,
cd /Users/orekinana/Desktop/code/Opencv2/app/
然后用javac创建类文件,这里我是把生成的类文件放到了bin文件夹下,
javac src/main/java/myfirstapp/orekinana/opencv/OpenCVHelper.java -d ./bin
然后啊,就该生成相应的头文件了,这里路径和文件名一定要完整,最后不能只写OpenCVHelper啊啊啊啊啊,会死的啊啊啊啊啊啊!!!
javah -jni -classpath ./bin -d ./src/main/java/myfirstapp/orekinana/opencv myfirstapp.orekinana.opencv.OpenCVHelper
然后在Jni里新建一个cpp和h文件,把之前h文件中的内容拷贝过去原来的就可以不要辣~然后在cpp文件中实现与之前设定的函数相对应的方法,这样我们之前在java文件中所定义的gray函数就可以用啦~这里给出例子中相对应的cpp实现哈~
#include "myfirstapp_orekinana_opencv_OpenCVHelper.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
JNIEXPORT jintArray JNICALL Java_myfirstapp_orekinana_opencv_OpenCVHelper_gray(int a, int b);
JNIEXPORT jintArray JNICALL Java_myfirstapp_orekinana_opencv_OpenCVHelper_gray(int a, int b) {
return a + b;
}
之后,需要将cpp文件编译进去,在Andorid.mk文件中加入
LOCAL_SRC_FILES := myfirstapp_orekinana_opencv_OpenCVHelper.cpp
然后在java层写个测试方法测试一下是否正常运行了
int a = 1, b = 1, c = 0;
c = add(a, b);
cout << c << endl;
return 0;
如果没有问题的话呢,就大功告成辣~(啪啪啪鼓个掌
然后我们就可以把刚刚用来测试的gray函数啊,cpp啊,java啊这里面的内容都可以删掉啦,然后就可以开始写你喜欢的东西辣,当然修改了之后步骤还是跟上面一样哈,在java里写好需要的接口然后哔哔哔的把那些命令们一敲,然后就在cpp文件夹里实现这些接口,然后我们就可以光明正大的在里main函数里玩儿辣咩哈哈哈哈哈~(虽然我的外表是java,但是我的心还是c++的!手动鼓掌!