2017-01-12 9 views
0

Я нашел много похожих проблем, но ни один из них, похоже, не был таким же, как этот, и ни одно из предложений не сработало.Android NDK unsatisfiedLinkError (только на android <4.3)

Я написал приложение для Android, которое использует NDK и OpenCv для некоторой обработки изображений. Все мои алгоритмы написаны на C++. Я использую android studio, gradle 2.2.2 и экспериментальный плагин gradle 0.8.3.

При тестировании на HTC M8, Galaxy S5 и LG V10 все работает безупречно. Но при попытке запустить на Samsung Galaxy S2 или Galaxy ACE3 следующие ошибки при запуске встречается,:

java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1892]: 1835 could not load needed library 'libopencv_java3.so for 'libnative.so' (load_library[1094]: Library 'libopencv_java3.so' not found) 

В моей MainActivity.java, я загрузить библиотеку:

static { 
    System.loadLibrary("native") 
} 

и у меня BaseLoaderCallback следующим образом:

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: { 
       Log.i(TAG, "OpenCV loaded successfully"); 
       mOpenCvCameraView.enableView(); 
      } 
      break; 
      default: { 
       super.onManagerConnected(status); 
      } 
      break; 
     } 
    } 
}; 

дополнительно инициализации OpenCV в OnCreate:

if (!OpenCVLoader.initDebug()) { 
    Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, 
this, mLoaderCallback); 
} else { 
    Log.d(TAG, "OpenCV library found inside package. Using it!"); 
    mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
} 

Мой build.gradle:

buildscript { 
repositories { 
    mavenCentral() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle:2.2.2' 
} 
} 

apply plugin: 'com.android.model.application' 

model { 
android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig.with { 
     applicationId "com.me.myapp" 
     minSdkVersion.apiLevel 15 
     targetSdkVersion.apiLevel 23 
     versionCode 9 
     versionName "1.5.3" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    ndk { 
     moduleName = "native" 
     cppFlags.add("-I${file(getOpenCVDir())}".toString()) 
     cppFlags.add("-frtti") 
     cppFlags.add("-fexceptions") 
     ldLibs.addAll(["log", "opencv_java3"]) 
     stl = "gnustl_static" 
    } 
} 
    buildTypes { 
     release { 

      //minifyEnabled false 
      //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    android.productFlavors { 
     // for detailed abiFilter descriptions, refer to "Supported ABIs" @ 
     // https://developer.android.com/ndk/guides/abis.html#sa 
     create("fat") { 
      ndk.abiFilters.add("armeabi") 
      ndk.abiFilters.add("armeabi-v7a") 
      ndk.abiFilters.add("mips") 
      ndk.abiFilters.add("x86") 
      ndk.abiFilters.add("arm64_v8a") 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi')}".toString()) 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString()) 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/mips')}".toString()) 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/arm64_v8a')}".toString()) 
      ndk.ldFlags.add("-L${file('src/main/jniLibs/x86')}".toString()) 
     } 
    } 
} 

def getOpenCVDir() { 
    Properties properties = new Properties() 
    properties.load(new File(rootDir.absolutePath + "/local.properties").newDataInputStream()) 
    def externalModuleDir = properties.getProperty('opencv.dir', null) 
    if (externalModuleDir == null) { 
     throw new GradleException(
      "OpenCV location not found. Define location with opencv.dir in the local.properties file!") 
} 
    return externalModuleDir 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
    exclude group: 'com.android.support', module: 'support-annotations' 
}) 
compile 'com.android.support:appcompat-v7:23.0.1' 
compile 'com.android.support:design:23.2.1' 
testCompile 'junit:junit:4.12' 
compile project(':openCVLibrary300') 
compile 'com.google.android.gms:play-services-appindexing:9.0.0' 
} 

apply plugin: 'com.google.gms.google-services' 

У меня также есть следующие папки с OpenCV LIBS в приложение/SRC/основные/jniLibs:

arm64-v8a 
armeabi 
armeabi-v7a 
mips 
mips64 
x64 
x86_64 

Сначала я думал, что это было связано с ABI , но кажется, что и M8, и S2 являются armeabi-v7a. Я также проверил в папке lib скомпилированных apk, каждая из выбранных папок abi присутствует и содержит файлы libopencv_java3.so и libnative.so). Есть ли какая-то несовместимость с более низкими версиями Android (< 4.4), о которых я не знаю?

ответ

0

В случае, если кто-то еще испытывает эту проблему, это то, что решить это для меня:

Я изменил

static { 
    System.loadLibrary("native"); 
} 

в

static { 
    if(!OpenCVLoader.initDebug()) 
     // Handle Error 
    }else 
    { 
     System.loadLibrary("native"); 
    } 
} 

Кроме того, я добавил вызов to mLoaderCallback.onManagerConnected to OnResume:

public void onResume() { 
    super.onResume(); 
    mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
    ....... 
} 

Я понятия не имею, почему это работает, поэтому объяснение этому все равно будет оценено. В противном случае, надеюсь, это поможет кому-то