2016-02-24 47 views
10

我正嘗試將本機預構建共享庫添加到我在Android Studio中的項目中。我正在使用gradle-experimental:0.6.0-alpha5。然而,每當我試圖預先構建的共享庫添加到我的應用程序模型,我得到以下錯誤:Android Studio中帶有實驗性Gradle插件的本地預構建共享庫

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

庫添加到應用程序模型是如何被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" 
      } 
     } 
    } 
} 

關鍵線是庫「shared_lib」。如果我取消註釋此行,則沒有錯誤。

由於這不起作用,我也嘗試使用ph0b.com的指南。他們使用添加本地共享庫不同的語法(我剛剛離開了頭,因爲我沒有一個單獨的目錄,包括所有的頭):

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" 
      } 
     } 
    } 
} 

然而,這並不正常工作。 Android Studio不會將我的shared_lib複製到apk文件。因此,我總是得到以下錯誤:

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

誰能告訴我怎麼可以包括本地預生成庫到我的項目?我正在使用buildToolsVersion = '22 .0.1'compileSdkVersion = 22作爲構建參數。

+0

你可能會嘗試用硬編碼路徑.so代替'$ {targetPlatform.getName()}'嗎? – RaGe

+0

是的,我已經試過了。如果我將路徑更改爲不存在的文件,Gradle肯定能夠解析路徑,因爲我得到一個錯誤。如果有解決我的問題,我仍然會很高興。但是,我暫時通過不再使用預建的庫來解決我的問題。我用'cppFlags.add(「 - I $ {file(」./../../../ projects/test/include「)}」。toString())'和cpp使用'srcDirs + =「./../../../ projects/test/src /」'到jni的文件。但是能夠使用預建的庫仍然會更好。 – budderick

+0

你可以用'--stacktrace'運行並獲取更多的錯誤嗎? – RaGe

回答

7

這一個爲我工作(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" 
      } 
     } 
    } 
} 

看起來他們只是忘記提及「binaries.withType」周圍的「YourLib {}」部分。

+0

謝謝!這對我在gradle-experimental上適用:0.6.0 – Xuelong

+0

我會將其標記爲一般問題的解決方案。 @Zhur的語法是正確的。但是,我認爲UnsatisfiedLinkError是一個更復雜的錯誤,大部分與Gradle文件無關。 – budderick

+0

@budderick它有:由於不正確的Gradle文件共享庫沒有進入APK。所以在運行時鏈接器無法找到該庫並拋出異常。 – zhur

相關問題