2016-05-20 9 views
1

私はAndroid Studio 1.5.1 Gradleバージョン2.8を使用しています。 Gradle experimental plugin v0.4.0 私はネイティブCコードとJavaコードを持つライブラリを持っています。私はすべてのアーキテクチャ(libcore.so)(arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86-64)のネイティブライブラリを使って、CoreLib-fat-release.aarライブラリを生成しています。 私はコアライブラリに応じて2番目のライブラリを持っています。コアライブラリを共有ライブラリとして作った。第二のライブラリのGradleファイルでaarファイルにネイティブライブラリ(* .so)ファイルがありません(従属ライブラリが共有ライブラリの場合)

jni { 
      dependencies { 
       project ":CoreLib" buildType "release" productFlavor "fat" linkage "shared" 
      } 
    } 

適切に構築することができますが、私は開いて、第二のライブラリAARファイルを見ると、私はすべての建築フォルダにlibcore.so参照いけません。

例: SecondLibrary脂肪-release.aar => SecondLibrary脂肪リリースジップ インサイドSecondLibrary脂肪リリース/ JNIフォルダ、唯一のx86とx86_64フォルダがファイルlibcore.so含まれています。他のフォルダ(arm64-v8a、armeabi、armeabi-v7a、mips、mips64)はlibcore.soファイルを含んでいません。

64ビットデバイスで2番目のライブラリを使用すると、64ビットではなく32ビットのライブラリが見つかりましたというUnSatisfiedLinkエラーが表示されます。ここ

は、第二のライブラリの私のbuild.gradleです:

apply plugin: 'com.android.model.library' 
model { 
android { 
    compileSdkVersion = 21 
    buildToolsVersion = "23.0.2" 
    defaultConfig.with { 
     minSdkVersion.apiLevel = 21 
     targetSdkVersion.apiLevel = 21 
     testInstrumentationRunner = "android.test.InstrumentationTestRunner" 
    } 
    lintOptions.with { 
     abortOnError = false 
    } 
} 
android.ndk { 
    moduleName = "secondlibrary 
    cppFlags.addAll("-I${file(folder_path)}".toString(), 
      "-I${file(sourcesDir +folder1)}".toString(), 
      "-I${file(sourcesDir +folder2)}".toString(), 
    ) 
    cppFlags.add("-frtti") 
    cppFlags.add("-fexceptions") 
    CFlags.addAll("-I${file(folder_path)}".toString(), 
      "-I${file(sourcesDir +folder1)}".toString(), 
      "-I${file(sourcesDir +folder2)}".toString(), 
    ) 
    CFlags.add("-O3") 
    CFlags.add("-funroll-loops") 
    CFlags.add("-Wall") 
    ldLibs.addAll(["android", "log", "stdc++", "c", "m", "z", "EGL", "GLESv2"]) 
    stl = "gnustl_shared" 
} 
// jni is the default dir; config this if yours is in different directory 
android.sources { 
    androidTest { 
     java { 
      source { 
       srcDirs '../test_sources_path/src' 
      } 
     } 
    } 
    main { 
     manifest { 
      source { 
       srcDirs '.' 
      } 
     } 
     java { 
      source { 
       srcDir "src" 
      } 
     } 
     jni { 
      dependencies { 
       project ":CoreLib" buildType "release" productFlavor "fat" linkage "shared" 
      } 
      source { 
       srcDirs = ["jni", 
          path1, 
          path2, 
          "libcore.so"] 
      } 
     } 
     jniLibs { 
      dependencies { 
       library file(path_to_binaries + "libcore.so") abi "armeabi" 
       library file(path_to_binaries + "libcore.so") abi "x86" 
       library file(path_to_binaries + "libcore.so") abi "armeabi-v7a" 
       library file(path_to_binaries + "libcore.so") abi "mips" 
       library file(path_to_binaries + "libcore.so") abi "x86_64" 
       library file(path_to_binaries + "libcore.so") abi "arm64-v8a" 
       library file(path_to_binaries + "libcore.so") abi "mips64" 
      } 
     } 
    } 
} 
android.productFlavors { 
    create("fat") 
} 
repositories { 
    libs(PrebuiltLibraries) { 
     CoreLib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file(path_to_binaries + "${targetPlatform.getName()}/libcore.so") 
      } 
     } 
    } 
} 
} 
dependencies { 
    compile project(':CoreLib-fat-release') 
} 

注:私は代わりに「共有」の「静的」としてCorelibでは結合を作る場合は、すべてのlibcore.soファイルがすべてに正しくコピーされていますフォルダ。

これはプログラミング上の問題か実験的なプラグインのバグかどうかお知らせください。あなたが何かを知っていれば私に示唆してください?ありがとうございました。

+0

計画0.6.0実験のプラグインを使用するために、彼らは明確な改善について述べたようにネイティブのライブラリの依存関係の解決。私の調査結果に基づいてこの投稿を更新します。ビルド済みのライブラリの依存関係を指定するための http://tools.android.com/tech-docs/new-build-system/gradle-experimental ** 0.6.0 - アルファ3 DSLが変更されました。 Gradle 2.8にアップデートされました。 ネイティブライブラリの依存関係解決に関するさまざまな問題を修正しました。** –

答えて

0

この問題は、次のようにして解決しました:

  1. 私は0.4.0から0.7.0への実験的なプラグインのバージョン(Gradleのバージョン2.10)を変更しました。 build.gradleに必要な
  2. 変更:

    • 私たちは、モデル要素の外側の変数を定義する必要があります。
    • 我々はこのコードブロックとして

      jniLibs { 
           dependencies { 
            library file(path_to_binaries + "libcore.so") abi "armeabi" 
            library file(path_to_binaries + "libcore.so") abi "x86" 
            library file(path_to_binaries + "libcore.so") abi "armeabi-v7a" 
            library file(path_to_binaries + "libcore.so") abi "mips" 
            library file(path_to_binaries + "libcore.so") abi "x86_64" 
            library file(path_to_binaries + "libcore.so") abi "arm64-v8a" 
            library file(path_to_binaries + "libcore.so") abi "mips64" 
           } 
      } 
      

を削除することができますで十分です:

repositories { 
libs(PrebuiltLibraries) { 
    CoreLib { 
     binaries.withType(SharedLibraryBinary) { 
      sharedLibraryFile = file(path_to_binaries + "${targetPlatform.getName()}/libcore.so") 
     } 
    } 
} 
関連する問題