多くの類似の問題が報告されていますが、どれもこれとまったく同じではないようです。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)と互換性がありませんか?