Per chi ancora alla ricerca, blork avuto l'idea giusta - è necessario compilare le librerie native per la tua piattaforma 'nativa' (Windows, Linux, Mac). L'NDK di Android crea librerie per la piattaforma Android (file .so - potrebbe funzionare anche su Linux), ed è per questo che non ci sono problemi in esecuzione in Activity Test Cases (perché carica un'istanza Android).
Per ottenere i test JUnit di livello basso, Hella veloce in esecuzione, è necessario supportare la JVM. Su Windows, questo potrebbe creare DLL, su Apple, sta creando i dylibs (assumendo le librerie condivise).
Ho appena completato un esempio nel mio repository android-ndk-swig-example (https://github.com/sureshjoshi/android-ndk-swig-example/issues/9).
In sostanza, nei miei CMakeLists, ho aggiunto un avvertimento di Apple:
# Need to create the .dylib and .jnilib files in order to run JUnit tests
if (APPLE)
# Ensure jni.h is found
find_package(JNI REQUIRED)
include_directories(${JAVA_INCLUDE_PATH})
E poi mi assicuro Gradle corre per i test unitari, ma utilizzando il sistema Mac costruire (non NDK).
def osxDir = projectDir.absolutePath + '/.externalNativeBuild/cmake/debug/osx/'
task createBuildDir() {
def folder = new File(osxDir)
if (!folder.exists()) {
folder.mkdirs()
}
}
task runCMake(type: Exec) {
dependsOn createBuildDir
workingDir osxDir // Jump to future build directory
commandLine '/usr/local/bin/cmake' // Path from HomeBrew installation
args '../../../../' // Relative path for out-of-source builds
}
task runMake(type: Exec) {
dependsOn runCMake
workingDir osxDir
commandLine 'make'
}
project.afterEvaluate {
// Not sure how much of a hack this is - but it allows CMake/SWIG to run before Android Studio
// complains about missing generated files
// TODO: Probably need a release hook too?
javaPreCompileDebug.dependsOn externalNativeBuildDebug
if (org.gradle.internal.os.OperatingSystem.current().isMacOsX()) {
javaPreCompileDebugAndroidTest.dependsOn runMake
}
}
CAVEAT TIME !!!
Quando si utilizza questo metodo, tecnicamente non si testano le librerie generate da NDK. Stai testando lo stesso codice, ma compilato usando un compilatore diverso (msvc, xcode, gcc, clang, qualsiasi cosa tu usi sull'host).
Ciò significa in pratica che la maggior parte dei risultati del test sarà valida, tranne quando si incontrano problemi causati da stranezze di ciascun compilatore, implementazioni STL, ecc. Questo non è così male come lo era 10 + anni fa, ma non si può dire con certezza al 100% che i risultati del test di JUnit con le librerie host siano identici alle librerie Android. Puoi dire che è ragionevolmente vicino, però.
Quindi, a meno che non si eseguano i test dell'unità nativa utilizzando l'NDK di Android per ciascuna architettura supportata, non si può nemmeno dire nulla sulla certezza ... Quindi prendi quello che vuoi da esso.
Un approccio eccessivo (ma davvero interessante se automatizzato) sarebbe quello di scrivere i test dell'unità nativi, ma li fai (Google Test, Catch, ecc.), Quindi compila ed esegui le tue librerie nativi e test unitari con l'NDK di Android ogni architettura. Ciò fornisce la copertura C/C++ tra le potenziali architetture di destinazione.
Da qui, è possibile utilizzare le librerie host summenzionate con JUnit per testare rapidamente il livello JNI interagendo con la libreria nativa. Nel tuo sistema CI, dovresti comunque eseguire questi stessi test unitari, ma come test di strumenti Android (o qualcos'altro che esegue un ambiente Android emulato).
Come per tutto, ovunque si disponga di un'interfaccia, è possibile creare mock - ma ad un certo punto, avrete bisogno anche di test di sistema/funzionali/di integrazione.
Aggiornamento:
più completa spiegazione di cui sopra in un articolo del blog (http://www.sureshjoshi.com/mobile/android-junit-native-libraries/)
Avete il vostro nome pacchetto corretto? Come stai caricando la tua libreria? –
Ho aggiunto alla mia domanda, vedi sopra. – blork
Verificheresti con questo: '-Djava.library.path =" "'? –