2016-02-24 16 views
10

Sto cercando di aggiungere una libreria condivisa precompilata nativa al mio progetto in Android Studio. Sto usando il gradle-experimental: 0.6.0-alpha5. Tuttavia, ogni volta che provo ad aggiungere la libreria condivisa prebuilt al mio modello di applicazione, ottengo il seguente errore:Libreria condivisa precompilata nativa in Android Studio con plug-in sperimentale Gradle

Error:Cause: org.gradle.api.internal.PolymorphicDomainObjectContainerConfigureDelegate

La biblioteca si aggiunge nel modello di applicazione come viene descritto dal Google Gradle Experimental Guide:

repositories { 
    prebuilt(PrebuiltLibraries) { 
     binaries.withType(SharedLibraryBinary) { 
      sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "shared_lib" 
      } 
     } 
    } 
} 

La linea cruciale è la libreria "shared_lib". Non c'è nessun errore se annullo questa riga.

Poiché non funziona, ho anche provato a utilizzare la guida da ph0b.com. Stanno usando una sintassi diversa per l'aggiunta di librerie condivise native (ho appena lasciato fuori le intestazioni dal momento che non ho una singola directory comprese tutte le intestazioni):

repositories { 
    libs(PrebuiltLibraries) { 
     shared_lib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jni { 
      dependencies { 
       library "shared_lib" linkage "shared" 
      } 
     } 
    } 
} 

Tuttavia, questo non funziona pure. Android Studio non copia my shared_lib nel file apk. Quindi, ottengo sempre il seguente errore:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [...] couldn't find "shared_lib.so"

Qualcuno può dirmi come posso includere la libreria di prefabbricazione nativa nel mio progetto? Sto usando buildToolsVersion = '22 .0.1 ' e compileSdkVersion = 22 come parametri di costruzione.

+0

potresti provare con il percorso codificato su .so invece di '$ {targetPlatform.getName()}'? – RaGe

+0

Sì, ci ho provato già. Gradle può sicuramente risolvere il percorso poiché ho un errore se cambio il percorso di un file inesistente. Sarei comunque felice se c'è una soluzione al mio problema. Tuttavia, ho temporaneamente risolto il mio problema non usando più le librerie pre-compilate. Ho aggiunto tutti i miei file header necessari con 'cppFlags.add (" - I $ {file ("./../../../ projects/test/include")} ". ToString())' e il cpp file con 'srcDirs + =" ./../../../ projects/test/src/"' a jni. Ma sarebbe comunque meglio poter usare le librerie predefinite. – budderick

+0

potresti eseguire con '--stacktrace' e ottenere più errori? – RaGe

risposta

7

Questo ha funzionato per me (0.6.0-beta6).

repositories { 
    prebuilt(PrebuiltLibraries) { 
     YourLib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("src/main/libs/armeabi-v7a/libYourLib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "YourLib" 
      } 
     } 
    } 
} 

Sembra che solo dimenticato di citare il "YourLib {}" parte intorno "binaries.withType".

+0

Grazie! Questo funziona per me su gradle-experimental: 0.6.0 – Xuelong

+0

Lo contrassegnerò come una soluzione al problema generale. La sintassi di @Zhur è quella corretta. Tuttavia, penso che UnsatisfiedLinkError sia un errore più complesso che per lo più non ha nulla a che fare con il file Gradle. – budderick

+0

@budderick Ha: a causa del file Gradle errato, la libreria condivisa non sta entrando nell'APK. Quindi al runtime il linker non riesce a trovare quella libreria e lancia l'eccezione. – zhur

Problemi correlati