簡體   English   中英

在Android項目中找不到ND4J共享庫

[英]ND4J Shared library can not be find in Android project

我正在這個同時需要OpenCV和DL4J的Android項目上工作。 但是在動態鏈接期間這兩者之間存在沖突。

在我的app / src / main / jniLibs中:我必須包含arm64-v8a文件夾,該文件夾具有文件libopencv_java3.so 但是,這現在使鏈接程序嘗試在此arm64-v8a文件夾中查找libdl.so和/或libjnind4jcpu.so ,由於從遠程存儲庫添加了DL4J,因此顯然不會存在。

因此,有沒有一種方法可以明確地告訴Gradle從遠程存儲庫中找到libdl.so和/或libjnind4jcpu.so 還是您將找到解決此問題的方法?


build.gradle

apply plugin: 'com.android.application'

android {
     compileSdkVersion 25
     buildToolsVersion '26.0.2'

defaultConfig {
    applicationId "gov.nih.nlm.malaria_screener"
    minSdkVersion 19
    targetSdkVersion 25
    versionCode 6 // start from 1
    versionName "1.3.2" // start from 1.0
    multiDexEnabled true
    jackOptions { // for Java 1.8
        enabled true
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'
    }
}

lintOptions { // for unsigned release build error on Time and Date picker
    checkReleaseBuilds false
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}



}

dependencies {
    compile files('libs/GraphView-4.0.1.jar')
    compile files('libs/AndroidSwipeLayout-v1.1.8.jar')
    compile 'com.dropbox.core:dropbox-core-sdk:2.0.1'
    compile files('libs/dropbox-android-sdk-1.6.3.jar')
    compile files('libs/json_simple-1.1.jar')
    compile files('libs/eventbus-3.0.0.jar')
    compile files('libs/glide-3.7.0.jar')
    compile files('libs/flickrj-android-2.0.0.jar')
    compile 'org.deeplearning4j:deeplearning4j-core:0.7.2'
    compile 'org.nd4j:nd4j-native:0.7.2'
    compile 'org.nd4j:nd4j-native:0.7.2:android-x86'
    compile 'org.nd4j:nd4j-native:0.7.2:android-arm'
//    implementation 'org.deeplearning4j:deeplearning4j-core:0.9.1'
//    implementation 'org.nd4j:nd4j-native:0.9.1'
//    implementation 'org.nd4j:nd4j-native:0.9.1:android-x86'
//    implementation 'org.nd4j:nd4j-native:0.9.1:android-arm'
//    implementation 'org.bytedeco.javacpp-presets:openblas:0.2.19-1.3:android-x86'
//    implementation 'org.bytedeco.javacpp-presets:openblas:0.2.19-1.3:android-arm'
    annotationProcessor 'org.projectlombok:lombok:1.16.10'
    compile project(':mysql-connector-java-5.1.43-bin')
    compile 'com.android.support:appcompat-v7:25.4.0'
    compile 'com.android.support:design:25.4.0'
    compile 'com.android.support:cardview-v7:25.4.0'
    compile 'com.android.support:support-v13:25.4.0'
    compile 'com.android.support:support-v4:25.4.0'
    compile 'com.android.support:recyclerview-v7:25.4.0'
    compile 'com.github.amlcurran.showcaseview:library:5.4.3'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation project(':openCVLibrary340')

錯誤:

 E/linker: library "/system/lib64/libdl.so" ("/system/lib64/libdl.so") needed or dlopened by "/system/lib64/libnativeloader.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="/data/app/gov.nih.nlm.malaria_screener-1/lib/arm64:/data/app/gov.nih.nlm.malaria_screener-1/base.apk!/lib/arm64-v8a", permitted_paths="/data:/mnt/expand:/data/data/gov.nih.nlm.malaria_screener"]
02-01 15:41:09.975 20294-22826/gov.nih.nlm.malaria_screener E/AndroidRuntime: FATAL EXCEPTION: Thread-5
                                                                              Process: gov.nih.nlm.malaria_screener, PID: 20294
                                                                              java.lang.ExceptionInInitializerError
                                                                                  at org.nd4j.nativeblas.NativeOpsHolder.getInstance(NativeOpsHolder.java:45)
                                                                                  at org.nd4j.linalg.cpu.nativecpu.ops.NativeOpExecutioner.<init>(NativeOpExecutioner.java:41)
                                                                                  at java.lang.Class.newInstance(Native Method)
                                                                                  at org.nd4j.linalg.factory.Nd4j.initWithBackend(Nd4j.java:5646)
                                                                                  at org.nd4j.linalg.factory.Nd4j.initContext(Nd4j.java:5554)
                                                                                  at org.nd4j.linalg.factory.Nd4j.<clinit>(Nd4j.java:189)
                                                                                  at org.nd4j.linalg.factory.Nd4j.read(Nd4j.java:2328)
                                                                                  at org.deeplearning4j.util.ModelSerializer.restoreMultiLayerNetwork(ModelSerializer.java:216)
                                                                                  at org.deeplearning4j.util.ModelSerializer.restoreMultiLayerNetwork(ModelSerializer.java:167)
                                                                                  at gov.nih.nlm.malaria_screener.Cells.<init>(Cells.java:117)
                                                                                  at gov.nih.nlm.malaria_screener.CameraActivity.ProcessImage(CameraActivity.java:1104)
                                                                                  at gov.nih.nlm.malaria_screener.CameraActivity$8.run(CameraActivity.java:874)
                                                                                  at java.lang.Thread.run(Thread.java:762)
                                                                               Caused by: java.lang.RuntimeException: ND4J is probably missing dependencies. For more information, please refer to: http://nd4j.org/getstarted.html
                                                                                  at org.nd4j.nativeblas.NativeOpsHolder.<init>(NativeOpsHolder.java:40)
                                                                                  at org.nd4j.nativeblas.NativeOpsHolder.<clinit>(NativeOpsHolder.java:16)
                                                                                  at org.nd4j.nativeblas.NativeOpsHolder.getInstance(NativeOpsHolder.java:45) 
                                                                                  at org.nd4j.linalg.cpu.nativecpu.ops.NativeOpExecutioner.<init>(NativeOpExecutioner.java:41) 
                                                                                  at java.lang.Class.newInstance(Native Method) 
                                                                                  at org.nd4j.linalg.factory.Nd4j.initWithBackend(Nd4j.java:5646) 
                                                                                  at org.nd4j.linalg.factory.Nd4j.initContext(Nd4j.java:5554) 
                                                                                  at org.nd4j.linalg.factory.Nd4j.<clinit>(Nd4j.java:189) 
                                                                                  at org.nd4j.linalg.factory.Nd4j.read(Nd4j.java:2328) 
                                                                                  at org.deeplearning4j.util.ModelSerializer.restoreMultiLayerNetwork(ModelSerializer.java:216) 
                                                                                  at org.deeplearning4j.util.ModelSerializer.restoreMultiLayerNetwork(ModelSerializer.java:167) 
                                                                                  at gov.nih.nlm.malaria_screener.Cells.<init>(Cells.java:117) 
                                                                                  at gov.nih.nlm.malaria_screener.CameraActivity.ProcessImage(CameraActivity.java:1104) 
                                                                                  at gov.nih.nlm.malaria_screener.CameraActivity$8.run(CameraActivity.java:874) 
                                                                                  at java.lang.Thread.run(Thread.java:762) 
                                                                               Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/gov.nih.nlm.malaria_screener-1/base.apk"],nativeLibraryDirectories=[/data/app/gov.nih.nlm.malaria_screener-1/lib/arm64, /data/app/gov.nih.nlm.malaria_screener-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libjnind4jcpu.so"
                                                                                  at java.lang.Runtime.loadLibrary0(Runtime.java:972)

由於您僅使用這些行包含android-x86android-arm

compile 'org.nd4j:nd4j-native:0.7.2:android-x86'
compile 'org.nd4j:nd4j-native:0.7.2:android-arm'

您將在apk中缺少arm64庫。 如果將其解壓縮並查看libs文件夾,則會看到類似

 libs   
|-->x86   
|    |-->libopencv_java3.so   
|    |-->libdl.so   
|-->armeabi   
|    |-->libopencv_java3.so   
|    |-->libdl.so   
|-->arm64   
     |-->libopencv_java3.so   

因此,當您啟動應用程序時,它將嘗試在沒有一個的arm64中查找libdl。

可能的解決方案:

  1. 添加nd4j lib的arm64版本。 另請注意,這是首選方法,因為Google將於2019年刪除32位支持

  2. 使用此方法從構建中排除arm64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM