Ошибка неудовлетворенной ссылки после внедрения разрешений 6.0

#android #java-native-interface #native

#Android #java-native-interface #родной

Вопрос:

Прежде чем я добавил разрешения в стиле Android 6.0, я мог запустить свое приложение, которое пытается загрузить .so библиотеку, которую я создал с Android.mk помощью файла, который вызывается из gradle. Я также попытался удалить код разрешения в своей деятельности и попытался запустить его снова, но ничего не произошло. Единственными файлами, которые я настроил после этого, являются файл gradle.build и MainActivity. Вот ошибка, которую я получаю:

 E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.example.fastsift, PID: 31413 
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/de.example.fastsift-2/base.apk"],nativeLibraryDirectories=[/data/app/de.example.fastsift-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libfast_sift_detector.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
at java.lang.System.loadLibrary(System.java:1076)
at de.worldiety.fastsift.MainActivity.<clinit>(MainActivity.java:57)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1095)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3083)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
 

Вот мой build.gradle:

 apply plugin: 'com.android.application'

 android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
    applicationId "de.example.fastsift"
    minSdkVersion 23 //had been 21 before changing Permissions
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    ndk{
        abiFilters 'armeabi-v7a'
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
externalNativeBuild {
    ndkBuild {
        path "src/main/jni/Android.mk"
    }
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
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:24.2.1'
testCompile 'junit:junit:4.12'
 

}

Вот код в моем Android.mk:

 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off
OPENCV_LIB_TYPE:=STATIC
ifdef OPENCV_ANDROID_SDK
  ifneq ("","$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)")
    include ${OPENCV_ANDROID_SDK}/OpenCV.mk
  else
    include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk
  endif
else
  include /Users/mtuchner/Desktop/opencv-master/platforms/build_android_arm/install/sdk/native/jni/OpenCV.mk
endif

LOCAL_SRC_FILES := ExtractorManager.cpp hpoint.cpp hrect.cpp JNIInterface.cpp kdnode.cpp kdtree.cpp KdtreeManager.cpp nnl.cpp priorityQueue.cpp
LOCAL_C_INCLUDES  = $(LOCAL_PATH)
LOCAL_LDLIBS  = -llog -ldl

LOCAL_MODULE := fast_sift_detector
include $(BUILD_SHARED_LIBRARY)
 

И код, который я использую для загрузки .so

 // used to load the fast_sift Library which holds the opencv Library and the Source Files.
static {
    System.loadLibrary("fast_sift_detector");
}

public native int trainDescriptor(String imagePath);
 

Я не знаю, что не так

Комментарии:

1. Попробуйте вернуть минимальную версию sdk

2. кажется, работает после того, как я добавил методы SupportLibrary для разрешений. Но почему я не могу загрузить такую встроенную библиотеку с помощью sdk23? Всегда ли мне нужно брать для этого меньший sdk?

3. Содержит ли ваша собственная библиотека перемещения текста? Верните версию sdk и проверьте logcat на наличие предупреждающего сообщения об этом. Для SDK 23 это вызывает ошибку.