2015-03-03 18 views
5

Sto eseguendo la migrazione di una libreria Android da Eclipse ad Android Studio. In Eclipse, potrei impostare NDK_MODULE_PATH tramite Progetto> Proprietà> Risorsa> Risorse collegate> Variabili del percorso. Ma come ottengo la stessa cosa in Android Studio, rispettivamente con gradle?Come impostare NDK_MODULE_PATH in Android Studio e/o gradle?

La mia libreria viene creata fino a quando non tenta di trovare le intestazioni per un modulo in NDK_MODULE_PATH.

Ecco il messaggio di errore:

 
Executing tasks: [:libAndroid:compileDebugSources, :physicaloidLibrary:compileDebugSources] 

Configuration on demand is an incubating feature. 
:libAndroid:preBuild UP-TO-DATE 
:libAndroid:preDebugBuild UP-TO-DATE 
:libAndroid:checkDebugManifest 
:libAndroid:preDebugAndroidTestBuild UP-TO-DATE 
:libAndroid:preReleaseBuild UP-TO-DATE 
:physicaloidLibrary:compileLint 
:physicaloidLibrary:copyReleaseLint UP-TO-DATE 
:physicaloidLibrary:mergeReleaseProguardFiles UP-TO-DATE 
:physicaloidLibrary:preBuild UP-TO-DATE 
:physicaloidLibrary:preReleaseBuild UP-TO-DATE 
:physicaloidLibrary:checkReleaseManifest 
:physicaloidLibrary:prepareReleaseDependencies 
:physicaloidLibrary:compileReleaseAidl UP-TO-DATE 
:physicaloidLibrary:compileReleaseRenderscript UP-TO-DATE 
:physicaloidLibrary:generateReleaseBuildConfig UP-TO-DATE 
:physicaloidLibrary:generateReleaseAssets UP-TO-DATE 
:physicaloidLibrary:mergeReleaseAssets UP-TO-DATE 
:physicaloidLibrary:generateReleaseResValues UP-TO-DATE 
:physicaloidLibrary:generateReleaseResources UP-TO-DATE 
:physicaloidLibrary:packageReleaseResources UP-TO-DATE 
:physicaloidLibrary:processReleaseManifest UP-TO-DATE 
:physicaloidLibrary:processReleaseResources UP-TO-DATE 
:physicaloidLibrary:generateReleaseSources UP-TO-DATE 
:physicaloidLibrary:compileReleaseJava UP-TO-DATE 
:physicaloidLibrary:processReleaseJavaRes UP-TO-DATE 
:physicaloidLibrary:packageReleaseJar UP-TO-DATE 
:physicaloidLibrary:compileReleaseNdk UP-TO-DATE 
:physicaloidLibrary:packageReleaseJniLibs UP-TO-DATE 
:physicaloidLibrary:packageReleaseLocalJar UP-TO-DATE 
:physicaloidLibrary:packageReleaseRenderscript UP-TO-DATE 
:physicaloidLibrary:bundleRelease UP-TO-DATE 
:libAndroid:prepareLibAndroidGradlePhysicaloidLibraryUnspecifiedLibrary UP-TO-DATE 
:libAndroid:prepareDebugDependencies 
:libAndroid:compileDebugAidl UP-TO-DATE 
:libAndroid:compileDebugRenderscript UP-TO-DATE 
:libAndroid:generateDebugBuildConfig UP-TO-DATE 
:libAndroid:generateDebugAssets UP-TO-DATE 
:libAndroid:mergeDebugAssets UP-TO-DATE 
:libAndroid:generateDebugResValues UP-TO-DATE 
:libAndroid:generateDebugResources UP-TO-DATE 
:libAndroid:mergeDebugResources UP-TO-DATE 
:libAndroid:processDebugManifest UP-TO-DATE 
:libAndroid:processDebugResources UP-TO-DATE 
:libAndroid:generateDebugSources UP-TO-DATE 
:libAndroid:compileDebugJava UP-TO-DATE 
:libAndroid:compileDebugNdk 
AGPBI: {"kind":"SIMPLE","text":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory","position":{},"original":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory"} 
AGPBI: {"kind":"SIMPLE","text":" #include \u003cdmtx.h\u003e","position":{},"original":" #include \u003cdmtx.h\u003e"} 
AGPBI: {"kind":"SIMPLE","text":"     ^","position":{},"original":"     ^"} 
AGPBI: {"kind":"SIMPLE","text":"compilation terminated.","position":{},"original":"compilation terminated."} 
AGPBI: {"kind":"SIMPLE","text":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1","position":{},"original":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1"} 


FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':libAndroid:compileDebugNdk'. 
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/opt/android-ndk/ndk-build'' finished with non-zero exit value 2 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Total time: 2.763 secs 

Tutte le idee su questo?

risposta

-1

Nella radice del progetto Android Studio, è presente un file denominato "local.properties". Aggiungi una proprietà denominata "ndk.dir" e imposta il valore in modo che punti alla posizione del ndk. Qualcosa come il seguente:

ndk.dir=/Users/username/sdk 

Forse non capisco la tua domanda. Se hai già impostato la posizione del ndk e vuoi solo assicurarti che un modulo venga creato, aggiungi il modulo al file "settings.gradle".

include ":<your module name>" 

quindi assicurarsi che si inserisce il codice C in "src/main/JNI" nel modulo. Gradle lo troverà automaticamente in base al nome della cartella. Non è più necessario impostare NDK_MODULE_PATH.

+0

penso che mi hai ragione, ma tanto per chiarire: ci sono usi diversi del termine "modulo", un modulo sotto $ NDK_MODULE_PATH è un modulo/libreria C/C++. Ho creato un modulo gradle nel mio progetto di libreria. Ma i makefile "Android.mk" vengono ignorati. Ci sono diversi post su Internet relativi a questo argomento. Ma se uno si basa su questi makefile, una build della libreria C/C++ potrebbe non riuscire. E.g. "libdmtx": ho solo bisogno di aggiungere "dmtx.c" al makefile e si costruisce con successo. Senza makefile ndk-build prova a creare ogni file in quella cartella e la compilazione fallisce. – rhodo

0

Usando: versione

  • Gradle: 3.3
  • Android versione plugin: com.android.tools.build:gradle:2.3.1

Questo funziona per me:

android { 

    ... 

    defaultConfig { 

     ... 

     ndk { 
      abiFilters 'armeabi', 'armeabi-v7a' 
     } 

     externalNativeBuild { 
      ndkBuild { 
       // TODO replace jniDependencies folder with the path to your modules 
       arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/jniDependencies" 
      } 
     } 
    } 

    externalNativeBuild { 
     ndkBuild { 
      path 'src/main/jni/Android.mk' 
     } 
    } 


} 

In questo modo non è necessario aggiungere NDK_MODULE_PATH al mio PERCORSO per creare il progetto. Tuttavia, il compito pulito non riesce, perché non prenderanno l'argomento da qui, quindi ho bisogno di aggiungere un altro hack per risolvere questo:

tasks.withType(com.android.build.gradle.tasks.ExternalNativeCleanTask) { 
    it.actions.clear() 

    doLast { 
     project.delete("${projectDir}/.externalNativeBuild") 
    } 
} 
Problemi correlati