2017-01-12 11 views
0

多くの類似の問題が報告されていますが、どれもこれとまったく同じではないようです。Android NDK unsatisfiedLinkError(android <4.3)

いくつかの画像処理にNDKとOpenCvを使用するAndroidアプリを作成しました。私のアルゴリズムはすべてC++で書かれています。私はアンドロイドスタジオ、gradle 2.2.2と実験的なgradleプラグイン0.8.3を使用しています。

HTC M8、Galaxy S5、LG V10でテストすると、完璧に動作します。しかし、サムスンギャラクシーS2やギャラクシーACE3次のエラーで実行しようとするとすると、起動時にoccures:私のMainActivity.javaで

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) 

、私は、ライブラリのロード:

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

のonCreateでさらにOpenCVの初期化を:

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' 

私はまた、アプリ/ srcに/メイン/ jniLibsでOpenCVのLIBSと次のフォルダがあります。

arm64-v8a 
armeabi 
armeabi-v7a 
mips 
mips64 
x64 
x86_64 

まず、私はそれがABIに関連していたと思いましたしかし、それはM8とS2の両方がarmeabi-v7aだと思われます。また、コンパイルされたapkのlibフォルダをチェックしました。各選択されたabiフォルダが存在し、libopencv_java3.soファイルとlibnative.soファイルがあります)。私が気付いていない安いAndroidバージョン(< 4.4)と互換性がありませんか?

答えて

0

誰がこの問題を持っている場合には、これは私のためにそれを解決したものです:

私は

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

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

を変更し、私はちょうど呼び出しを追加しましたtomLoaderCallback.onManagerをOnResumeに接続しました。

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

私はこれがなぜ機能するのか分かりませんので、これについての説明はまだ分かります。それ以外の場合は、これが誰かに役立つことを願って