2016-02-24 10 views
10

Android Studioのプロジェクトにネイティブのビルド済み共有ライブラリを追加しようとしています。私はgradle-experimental:0.6.0-alpha5を使用しています。私は自分のアプリケーションモデルに構築済みの共有ライブラリを追加しようとするたびしかし、私は次のエラーを取得する:実験的なGradleプラグインを使用したAndroidスタジオのネイティブ事前ビルド共有ライブラリ

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

あなたは '$ {targetPlatform.getName()}'の代わりに.soにハードコーディングされたパスを試してみることができますか? – 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" 
      } 
     } 
    } 
} 

"YourLib {}"の部分を "binaries.withType"の周りに置いているのを忘れてしまったように見えます。

+0

ありがとうございました!これはgradle-experimentalで私にとって役に立ちます:0.6.0 – Xuelong

+0

これを一般的な問題の解決策としてマークします。 @ Zhurの構文は正しいものです。しかし、UnsatisfiedLinkErrorは、Gradleファイルとほとんど関係がない、より複雑なエラーであると私は思う。 – budderick

+0

@budderickそれは:誤ったGradleファイルのため、共有ライブラリがAPKに入っていない。したがって、実行時にリンカはそのライブラリを見つけることができず、例外をスローします。 – zhur

関連する問題