#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 это вызывает ошибку.