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 app
build.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.
także rzucić okiem na oficjalnej przykład hello-libs: https://github.com/googlesamples/android -ndk/drzewo/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs –