2017-01-12 3 views
0

Ich habe eine Menge ähnlicher Probleme geschrieben, aber keiner von ihnen scheint genau das gleiche zu sein, und keiner der Vorschläge hat funktioniert.Android NDK unzufrieden LinkError (nur auf Android <4.3)

Ich habe eine Android-App geschrieben, die das NDK und OpenCv für einige Bildverarbeitung verwendet. Alle meine Algorithmen sind in C++ geschrieben. Ich benutze Android Studio, Gradle 2.2.2 und das experimentelle Gravel Plugin 0.8.3.

Beim Testen auf einem HTC M8, Galaxy S5 und LG V10 funktioniert alles einwandfrei. Aber wenn es auf einem Samsung Galaxy S2 oder Galaxy Ace3 der folgende Fehler occures beim Start zu laufen versuchen:

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) 

In meinem MainActivity.java, lade ich die Bibliothek:

static { 
    System.loadLibrary("native") 
} 

und habe meine BaseLoaderCallback wie folgt:

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; 
     } 
    } 
}; 

Zusätzlich wird die OpenCV Initialisierung in 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); 
} 

Mein 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' 

ich die folgenden Ordner mit opencv Libs in app/src/main/jniLibs auch haben:

arm64-v8a 
armeabi 
armeabi-v7a 
mips 
mips64 
x64 
x86_64 

Zuerst dachte ich, es mit dem ABI verbunden war , aber es scheint, sowohl die M8 als auch die S2 sind armeabi-v7a. Ich habe auch den kompilierten apk lib-Ordner eingecheckt, jeder der gewählten abi-Ordner ist vorhanden und enthält die Dateien libopencv_java3.so und libnative.so. Gibt es eine Inkompatibilität zu niedrigeren Android-Versionen (< 4.4), die mir nicht bekannt sind?

Antwort

0

Falls jemand dieses Problem hat, das, was es für mich gelöst ist:

ich die

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

zu

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

Zusätzlich

verändert, habe ich nur noch den Anruf zu mloaderCallback.onManagerConnected to OnResume:

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

Ich habe keine Ahnung, warum das funktioniert, also würde eine Erklärung dafür noch geschätzt werden. Ansonsten hoffe, das hilft jemandem