마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

JavaCV 에러.. 좀 아시는분..

0 추천

안녕하세요 

지금 JavaCV를 이용해서 이미지 관련 처리를 하고있는데

현재 갤럭시 S4에서는 아무 이상없이 잘 작동하는데

Note2 에서는 이상하게 javacv를 사용할때 에러가 뜹니다..

뜨는 부분은

opencv_core.MAT test = opencv_imgcodecs.imread(~~);

처음사용하는 이 부분에서 바로 뜹니다..

에러 내용을 보면 길게도 뜨는데 

처음

dlopen("/data/app-lib/kr.co.~~~-78/libjniopencv_core.so") failed: dlopen failed: cannot locate symbol "_ZNK2cv14DefaultDeleterI13CvFileStorageEclEPS1_" referenced by "libjniopencv_core.so"...

중간

Caused by: java.lang.NoClassDefFoundError: java.lang.ClassNotFoundException: org.bytedeco.javacpp.opencv_core

Caused by: java.lang.UnsatisfiedLinkError: Couldn't load gnustl_static from loader dalvik.system.PathClassLoader

 

이 3부분이 의심되는데 결국 opencv_core.so 파일을 못찾아서 그런것 같습니다

저 3개에러 내용으로 5일정도 구글링해서 계속 수정해봤는데 역시 노트2에서만 계속 에러를 

못잡고있습니다..

 

구글링 해보니 대부분 셋팅이 잘못됬다던가 그런내용이라 dependencies 수없이 많이 추가해봤는데

결국 해결을 못하였습니다.. 혹시나 도움좀 주실분 있으시면 감사하겠습니다.

아래는 build.gradle 입니다.. 모든걸 다 넣은듯한..

android {
    packagingOptions {
        exclude 'META-INF/services/javax.annotation.processing.Processor'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/1.2/javacpp-presets-1.2.pom.xml'
        pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/org.bytedeco.javacpp-presets-1.2.pom.xml'

    }
configurations {
    all*.exclude group: 'org.bytedeco', module: 'javacpp-presets'
}
sourceSets {
    main {
        jniLibs.srcDir 'src/main/jniLibs'
    }
}
productFlavors {
    fat {
        flavorDimension "abi"
        ndk {
            abiFilters "x86", "armeabi-v7a", "armeabi"
            versionCode = 0;
        }
    }
    arm {
        flavorDimension "abi"
        ndk {
            abiFilter "armeabi"
            versionCode = 1;
        }
    }
    armv7a {
        flavorDimension "abi"
        ndk {
            abiFilter "armeabi-v7a"
            versionCode = 3;
        }
    }
    x86 {
        flavorDimension "abi"
        ndk {
            abiFilter "x86"
            versionCode = 6;
        }
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'org.bytedeco:javacv:1.2'
    compile 'org.bytedeco:javacpp:1.2'
    compile group: 'org.bytedeco', name: 'javacv', version: '1.2'

    compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-arm'
    compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-x86'

    compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-arm'
    compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-x86'


    compile files('libs/opencv.jar')
    compile files('libs/ffmpeg.jar')
    compile files('libs/javacpp.jar')
    compile files('libs/javacv.jar')


    compile files('libs/ffmpeg-android-x86.jar')
    compile files('libs/ffmpeg-android-arm.jar')

    compile files('libs/opencv-android-arm.jar')
    compile files('libs/opencv-android-x86.jar')

    compile files('libs/javacv-android-arm.jar')
    compile files('libs/javacv-android-x86.jar')

    compile("org.bytedeco.javacpp-presets:opencv:2.4.11-0.11:windows-x86_64")
    compile("org.bytedeco.javacpp-presets:ffmpeg:2.6.1-0.11:windows-x86_64")

    compile("org.bytedeco.javacpp-presets:opencv:2.4.11-0.11:android-arm")
    compile("org.bytedeco.javacpp-presets:ffmpeg:2.6.1-0.11:android-arm")

    compile("org.bytedeco.javacpp-presets:opencv:2.4.11-0.11:android-x86")
    compile("org.bytedeco.javacpp-presets:ffmpeg:2.6.1-0.11:android-x86")
}

셋팅 말고도 

libs, jinLibs 등등 폴더에 armeabi, armeabi-v7a-x86 생성해서 모든 *.so 파일 다 넣어져 있는 상태입니다.

익명사용자 님이 2016년 8월 16일 질문

1개의 답변

0 추천
 
채택된 답변

로그는 libjniopencv_core.so 파일을 dlopen하려는데 

 "_ZNK2cv14DefaultDeleterI13CvFileStorageEclEPS1_"  심볼을 찾지 못해 dlopen이 실패 해서 발생하는 오류로 보입니다.

 

"_ZNK2cv14DefaultDeleterI13CvFileStorageEclEPS1_" 는 demangling 해보면 아래와 같습니다.

cv::DefaultDeleter<CvFileStorage>::operator()(CvFileStorage*) const

 

대충 검색했더니 아래와 같은 부분이 나오네요..

https://sourceforge.net/p/emgucv/opencv/ci/0c7663eb3bfe2a0e11f786f7d3e3dc4467b285d2/tree/modules/core/src/array.cpp?barediff=f46b7fcf86cf7659b6b7ef1d07ca4bc6e262eee4

diff 내용에 나오듯, openCV의 symbol 이 중간에 변경된듯 하며,

 노트2에는 이 이전 심볼로 so가 빌드가 되어 있어서  symbol을 찾지 못해 오류가 발생한 것으로 생각됩니다.

 정상적으로 동작되는 폰에서 libopencv.so를 꺼내, libopencv_modify.so 같은 것으로 이름만 바꿔 libjniopencv_core.so에서 libopencv_modify.so를 참조하게 바꾸시거나 libopencv.so를 직접 빌드하하여 libjniopencv_core.so에서 참조하게 변경하시는게 좋을 듯 합니다.

 

익명사용자 님이 2016년 8월 16일 답변
2016년 8월 16일 수정
댓글 정말 감사합니다
한번 해보겠습니다^
안녕하세요! 저 혹시 죄송하지만 javaCV 안드로이드 스튜디오에 import하는 방법 좀 상세히 알려주실 수 있으신가요? ㅠㅠ
...