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?