2017-01-03 64 views
5

Jestem nowicjuszem dla systemu Android, więc wybacz mi, jeśli wydaje się to trochę niedojrzałe. Mam dwie wbudowane biblioteki statyczne, feta (../../feta/build/libfeta.a) i mish (../../mish/build/libmish.a) i mam wspólną bibliotekę JNI. Używanie biblioteki JNI działa doskonale, ale próbuję uzyskać dostęp zarówno do feta, jak i mish przez bibliotekę JNI. Te dwie biblioteki są nieustannie zmieniane i aktualizowane wraz z projektem Android, więc ich kopiowanie za każdym razem, gdy są one budowane, nie jest tak naprawdę opcją (jeśli to nawet rozwiązałoby problem z linkowaniem), a ja nie wolałbym po prostu kopiować pliki źródłowe do projektu Android.Powiąż bibliotekę statyczną z biblioteką współdzieloną JNI w Androidzie

Próbowałem wyszukiwać, ale większość odpowiedzi używa starej wersji systemu i chcę zmodyfikować Android.mk, której nie mam. Używam najnowszej wersji Androida Studio, korzysta z wtyczki Gradle.

Próbowałem użyć całej konfiguracji z kilkunastu samouczków i odpowiedzi Stackoverflow w różnych konfiguracjach, ale bez powodzenia.

Jeśli odpowiesz, podaj pełny i działający build.gradle, więc nie napotkam na te same problemy, które otrzymuję od innych odpowiedzi (dziękuję!).

Zadałem to pytanie już po przeczytaniu tutoriala this, więc wszystkie pliki to odzwierciedlą.

Oto błąd kompilacji dostaję:

Error:A problem occurred configuring project ':app'. 
> The following model rules could not be applied due to unbound inputs and/or subjects: 
    android.sources { ... } @ app/build.gradle line 58, column 5 
     subject: 
     - android.sources Object [*] 
    repositories { ... } @ app/build.gradle line 39, column 5 
     subject: 
     - repositories Object [*] 
    [*] - indicates that a model item could not be found for the path or type. 

Oto mój plik wewnątrz modułu appbuild.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "com.neonorb.mish_android" 
     minSdkVersion 15 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     externalNativeBuild { 
      cmake { 
       cppFlags "-std=c++14 -Wno-implicit-exception-spec-mismatch" 
      } 
     } 
     ndk { 
      // ${targetPlatform.getName()} 
      // ${buildType.getName()} 
      stl "c++_static" 
      abiFilters "x86_64" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    externalNativeBuild { 
     cmake { 
      path "CMakeLists.txt" 
     } 
    } 
} 

model { 
    repositories { 
     libs(PrebuiltLibraries) { 
      feta { 
       headers.srcDir "../../feta/include/" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("../../feta/build/libfeta.a") 
       } 
      } 
     } 
     libs(PrebuiltLibraries) { 
      mish { 
       headers.srcDir "../../mish/include/" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("../../mish/build/libmish.a") 
       } 
      } 
     } 
    } 

    android.sources { 
     main { 
      jni { 
       dependencies { 
        library "feta" linkage "static" 
        library "mish" linkage "static" 
       } 
      } 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.1.0' 
    compile 'com.google.android.gms:play-services-ads:10.0.1' 
    compile 'com.android.support:design:25.1.0' 
    testCompile 'junit:junit:4.12' 
} 

A oto korzeń (mish-android) katalog jedno:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.2.3' 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

A oto mój numer CMakeLists.txt:

# Sets the minimum version of CMake required to build the native 
# library. You should either keep the default value or only pass a 
# value of 3.4.0 or lower. 

cmake_minimum_required(VERSION 3.4.1) 

# Creates and names a library, sets it as either STATIC 
# or SHARED, and provides the relative paths to its source code. 
# You can define multiple libraries, and CMake builds it for you. 
# Gradle automatically packages shared libraries with your APK. 

add_library(# Sets the name of the library. 
      mish-android 

      # Sets the library as a shared library. 
      SHARED 

      # Provides a relative path to your source file(s). 
      # Associated headers in the same location as their source 
      # file are automatically included. 
      src/main/cpp/mish.cpp) 

# Searches for a specified prebuilt library and stores the path as a 
# variable. Because system libraries are included in the search path by 
# default, you only need to specify the name of the public NDK library 
# you want to add. CMake verifies that the library exists before 
# completing its build. 

find_library(# Sets the name of the path variable. 
       log-lib 

       # Specifies the name of the NDK library that 
       # you want CMake to locate. 
       log) 

# Specifies libraries CMake should link to your target library. You 
# can link multiple libraries, such as libraries you define in the 
# build script, prebuilt third-party libraries, or system libraries. 

target_link_libraries(# Specifies the target library. 
         mish-android 

         # Links the target library to the log library 
         # included in the NDK. 
         ${log-lib}) 

Oto moja struktura katalogów, jeśli w ogóle pomaga.

enter image description here

+0

także rzucić okiem na oficjalnej przykład hello-libs: https://github.com/googlesamples/android -ndk/drzewo/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs –

Odpowiedz

0

Jak się okazuje, musiałem zaktualizować wtyczkę Gradle. Udało mi się usunąć CMakeLists.txt. Musiałem również uaktualnić moją wersję opakowania Gradle do wersji 3.2, aby obsługiwać nową wtyczkę eksperymentalną.

Oto mój korzeń build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     //classpath 'com.android.tools.build:gradle:2.2.3' 
     classpath 'com.android.tools.build:gradle-experimental:0.9.0-beta1' 

     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

Oto mój appbuild.gradle:

apply plugin: 'com.android.model.application' 

model { 
    android { 
     compileSdkVersion 25 
     buildToolsVersion "25.0.2" 
     defaultConfig { 
      applicationId "com.neonorb.mish_android" 
      minSdkVersion.apiLevel 15 
      targetSdkVersion.apiLevel 25 
      versionCode 1 
      versionName "1.0" 
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     } 
     ndk { 
      moduleName "mish-android" 
      ldLibs.add("log") 
      cppFlags.add("-std=c++14") 
      cppFlags.add("-Wno-implicit-exception-spec-mismatch") 
      // ${targetPlatform.getName()} 
      // ${buildType.getName()} 
      stl "c++_static" 
      abiFilters.addAll(["x86_64"]) 
      // only build for x86_64 because that's all Feta and Mish support atm 
     } 
     buildTypes { 
      release { 
       minifyEnabled false 
       proguardFiles.add(file("proguard-rules.pro")) 
      } 
     } 
     sources { 
      main { 
       jni { 
        source { 
         srcDir "src" 
        } 
        dependencies { 
         library "feta" linkage "static" 
         library "mish" linkage "static" 
        } 
       } 
      } 
     } 
    } 
    repositories { 
     libs(PrebuiltLibraries) { 
      feta { 
       headers.srcDir "../../feta/include/" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("../../feta/build/libfeta.a") 
       } 
      } 
     } 
     libs(PrebuiltLibraries) { 
      mish { 
       headers.srcDir "../../mish/include/" 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("../../mish/build/libmish.a") 
       } 
      } 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.1.0' 
    testCompile 'junit:junit:4.12' 
}