2016-05-10 9 views
1

Ich versuche, etwas Code in C++ zu verwenden, die die OpenCV-Bibliothek in einem Android-Projekt verwendet. Ich benutze Android Studio 2.1 und Gradle Version 2.1.0 (experimentell 0.7.0). Das Problem besteht darin, dass der Compiler die opencv-Bibliotheken nicht finden kann. Zum Beispiel in diesem Code:OpenCV native Integration in Android NDK mit Gradle

#include <string.h> 
#include <jni.h> 
#include <opencv2/opencv.hpp> 

extern "C" { 

JNIEXPORT void JNICALL 
Java_com_teaminfernale_gazetracker_MainActivity_filterImage(JNIEnv *env, jobject instance, 
                 jlong matAddr) { 

    cv::Mat& src_img = *(cv::Mat*)matAddr; 
    cv::cvtColor(src_img, src_img, CV_BGR2GRAY); 
} 

dies ist der Fehler:

Error:(12) undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)' 
Error:error: ld returned 1 exit status 
Error:Execution failed for task ':app:linkMain-jniArm64-v8aDebugAllSharedLibrary'. 
A build operation failed. 
Linker failed while linking libmain-jni.so. 

Hier meine gradle Dateien:

built.gradle in App-Ordner:

apply plugin: 'com.android.model.application' 
model { 
android { 
    compileSdkVersion = 23 
    buildToolsVersion = "23.0.2" 

    defaultConfig.with { 
     applicationId = "com.teaminfernale.gazetracker" 
     minSdkVersion.apiLevel = 19 
     targetSdkVersion.apiLevel = 23 
     versionCode = 1 
     versionName = "1.0" 
    } 

    buildTypes { 
     release { 
      minifyEnabled = false 
      proguardFiles.add(file('proguard-android.txt')) 
     } 
    } 

    ndk { 
     moduleName = "main-jni" 
     cppFlags.add("-std=c++11") 
     cppFlags.add("-fexceptions") 
     cppFlags.add("-I${file("src/main/jni/include")}".toString()) 
     ldLibs.add("android") 
     ldLibs.add("EGL") 
     ldLibs.add("GLESv2") 
     ldLibs.add("dl") 
     ldLibs.add("log") 
     ldLibs.add("z") 
     stl = "gnustl_shared" 
    } 


} 

android.productFlavors { 

    create("arm") { 
     ndk.with { 
      abiFilters.add("armeabi") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\armeabi\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 
    create("arm7") { 
     ndk.with { 
      abiFilters.add("armeabi-v7a") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\armeabi-v7a\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 
    create("arm8") { 
     ndk.with { 
      abiFilters.add("arm64-v8a") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\arm64-v8a\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 

    create("x86") { 
     ndk.with { 
      abiFilters.add("x86") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\x86\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 
    create("x86-64") { 
     ndk.with { 
      abiFilters.add("x86_64") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\x86_64\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 

    create("mips") { 
     ndk.with { 
      abiFilters.add("mips") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\mips\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 
    create("mips-64") { 
     ndk.with { 
      abiFilters.add("mips64") 
      File curDir = file('./') 
      curDir = file(curDir.absolutePath) 
      String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\mips64\\" 

      ldFlags.add(libsDir + "libopencv_core.a") 
      ldFlags.add(libsDir + "libIlmImf.a") 
      ldFlags.add(libsDir + "liblibjasper.a") 
      ldFlags.add(libsDir + "liblibjpeg.a") 
      ldFlags.add(libsDir + "liblibpng.a") 
      ldFlags.add(libsDir + "liblibtiff.a") 
      ldFlags.add(libsDir + "liblibwebp.a") 
      ldFlags.add(libsDir + "libtbb.a") 
      ldFlags.add(libsDir + "libopencv_calib3d.a") 
      ldFlags.add(libsDir + "libopencv_features2d.a") 
      ldFlags.add(libsDir + "libopencv_flann.a") 
      ldFlags.add(libsDir + "libopencv_hal.a") 
      ldFlags.add(libsDir + "libopencv_highgui.a") 
      ldFlags.add(libsDir + "libopencv_imgcodecs.a") 
      ldFlags.add(libsDir + "libopencv_imgproc.a") 
      ldFlags.add(libsDir + "libopencv_ml.a") 
      ldFlags.add(libsDir + "libopencv_objdetect.a") 
      ldFlags.add(libsDir + "libopencv_photo.a") 
      ldFlags.add(libsDir + "libopencv_shape.a") 
      ldFlags.add(libsDir + "libopencv_stitching.a") 
      ldFlags.add(libsDir + "libopencv_superres.a") 
      ldFlags.add(libsDir + "libopencv_ts.a") 
      ldFlags.add(libsDir + "libopencv_video.a") 
      ldFlags.add(libsDir + "libopencv_videoio.a") 
      ldFlags.add(libsDir + "libopencv_videostab.a") 
      ldFlags.add(libsDir + "libopencv_java3.so") 

     } 
    } 
    create("all") 
} 
} 

dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.3.0' 
compile project(':opencv') 
} 

gebaut. Gradle in opencv-Ordner:

apply plugin: 'com.android.library' 
buildscript { 
repositories { 
    mavenCentral() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle:2.1.0' 
} 
} 

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.2" 

defaultConfig { 
    minSdkVersion 19 
    targetSdkVersion 23 
    versionCode 2480 
    versionName "2.4.8" 
} 

sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     resources.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
     aidl.srcDirs = ['src'] 
     jniLibs.srcDir 'src/main/jniLibs' 
    } 
} 
} 

built.gradle im Hauptprojektordner:

buildscript { 
repositories { 
    jcenter() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle-experimental:0.7.0' 
} 
} 

allprojects { 
repositories { 
    jcenter() 
} 
} 

task clean(type: Delete) { 
delete rootProject.buildDir 
} 

settings.gradle:

include ':app' 
include ':opencv' 

das komplette Projekt, wenn klarer sein kann: https://github.com/eug93/GazeTracker für meine Unfähigkeit

Sorry, aber ich konnte keine brauchbare Lösung finden. Danke

+0

, um das Problem zu isolieren, hinzufügen müssen versuchen zu bauen ohne Aromen und listet die OpenCv-Bibliotheken im Hauptblock ** ndk ** auf. –

+0

Haben Sie Erfolg Bibliothek zu kompilieren ?. Ich brauche das Gleiche und bin seit einigen Wochen verzweifelt. Vielen Dank! –

+0

Ja, wenn Sie das Projekt verlinkt sehen, gibt es die Bibliothek im Inneren, beide in Java und native c (mit auch anderen Dingen) verwendet. Das solltest du überprüfen –

Antwort

-1

Sie android.mk Datei in jni Ordner

und folgende Zeile in build.gradle

sourceSets.main {

jni.srcDirs = [] //disable automatic ndk-build call 
    jniLibs.srcDir 'src/main/jniLibs' 
} 

buildTypes { 
.. 
    } 
Verwandte Themen