I am currently working on a project that uses OpenCV3 to process real-time video (using a set of color filters), and I managed to get it to work with Java without any problems.
What I'm trying to do next is to implement all my Java logic in C ++ through the NDK (to improve performance). This way, I will not need to convert the MAT object to byte buffers back and fort, saving a couple of loops. But I'm really stuck trying to link .so, .a static libraries and header files using gradle for use in my .CPP files.
This is the gradle file I'm using:
apply plugin: 'com.android.model.application'
def opencvandroid_sdk_path = file(project(':opencvandroid').projectDir).absolutePath + "/src/main"
model {
repositories {
libs(PrebuiltLibraries) {
opencv {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_calib3d.a")
}
}
opencv1 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_core.a")
}
}
opencv2 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_features2d.a")
}
}
opencv3 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_flann.a")
}
}
opencv4 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_highgui.a")
}
}
opencv5 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgcodecs.a")
}
}
opencv6 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgproc.a")
}
}
opencv7 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_ml.a")
}
}
opencv8 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_objdetect.a")
}
}
opencv9 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_photo.a")
}
}
opencv10 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_shape.a")
}
}
opencv11 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_stitching.a")
}
}
opencv12 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_superres.a")
}
}
opencv13 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_video.a")
}
}
opencv14 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videoio.a")
}
}
opencv15 {
headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"
binaries.withType(StaticLibraryBinary) {
staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videostab.a")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "com.example"
minSdkVersion.apiLevel = 16
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
}
/*
* native build settings
*/
android.ndk {
moduleName = "hello-jni"
/*
* Other ndk flags configurable here are
* cppFlags += "-fno-rtti"
* cppFlags += "-fno-exceptions"
* ldLibs = ["android", "log"]
* stl = "system"
*/
platformVersion = 16 //same as minSdkVersion.apiLevel for better compatibility
/*def jniPath = opencvandroid_sdk_path + "jniLibs"
cppFlags += "-I${file(jniPath)}".toString()
file(jniPath).eachDirRecurse { dir ->
cppFlags += "-I${file(dir)}".toString()
}*/
stl = "c++_static"
ldLibs.addAll(["atomic", "log", "android"])
}
android.sources {
main {
jni {
dependencies {
library "opencv1" linkage "static"
library "opencv2" linkage "static"
library "opencv3" linkage "static"
library "opencv4" linkage "static"
library "opencv5" linkage "static"
library "opencv6" linkage "static"
library "opencv7" linkage "static"
library "opencv8" linkage "static"
library "opencv9" linkage "static"
library "opencv10" linkage "static"
library "opencv11" linkage "static"
library "opencv12" linkage "static"
library "opencv13" linkage "static"
library "opencv14" linkage "static"
library "opencv15" linkage "static"
}
}
}
}
android.buildTypes {
release {
minifyEnabled = false
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile project(':opencvandroid')
}
gradle , github.
, , , , OPENCV , , lib gradle, , gradle .
, .CPP-, Android Studio ( ). CPP:
#include <jni.h>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include <vector>
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);
JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
{
Mat& mGr = *(Mat*)addrGray;
Mat& mRgb = *(Mat*)addrRgba;
vector<KeyPoint> v;
Ptr<FeatureDetector> detector = FastFeatureDetector::create(50);
detector->detect(mGr, v);
for( unsigned int i = 0; i < v.size(); i++ )
{
const KeyPoint& kp = v[i];
circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));
}
}
}
- , ?