6

Android Studio non riesce a trovare i miei file di intestazione quando si trovano in una posizione diversa dalla cartella di origine principale del mio modulo. Ciò è evidente dalle #include istruzioni "SDL_config.h" che sono evidenziate in rosso (altre affermazioni #include vanno bene).Come si imposta un percorso di inclusione C/C++ con il plug-in sperimentale Gradle?

Ho provato a modificare i valori cppFlags di seguito, ma sto iniziando a dubitare che questi cppFlags vengano addirittura passati al compilatore.

Qualcuno è riuscito a includere file da cartelle diverse dalla loro cartella di origine principale in questo modo?

C'è un problema con il modo in cui ho specificato cppFlags, o forse il moduleName o anche le fonti?

Potrei passare attraverso la sorgente SDL2 e modificare tutte le istruzioni #include sui percorsi relativi #include ma non voglio veramente modificare la sorgente SDL2. Dovrei semplicemente essere in grado di specificare un elenco di percorsi di inclusione in qualche modo.

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

model { 
... 
    android.ndk { 
     moduleName = 'main' 

     //W:\hello-sdl-android\android-project\app\src\main\jni\SDL2\include 
     cppFlags += "-I${file("src/main/jni/SDL2/include")}".toString() 
     cppFlags += "-I${file("src/main/jni/SDL2/src")}".toString() 
    } 

    android.sources { 
     main.jni { 
      source { 
       srcDirs += ['src/main/jni/src'] 
       srcDirs += ['src/main/jni/SDL2/src'] 
      } 
     } 
    } 
... 
} 

UPDATE: Ecco maggiori informazioni sul mio attuale layout del progetto:

app/src/main/jni app/src/main/jni/src/Main.cpp < - Questa è la compilazione app/src/main/jni/SDL2 < - Tutto fonte SDL2 è in fase di qui app/src/main/jni/GLM < - Tutto fonte GLM è in fase di qui

Questo layout è un risultato diretto di utilizzare il progetto di esempio che Mi è stato fornito qui: https://gitlab.com/scannerdarkly/hello-sdl-android

Quel progetto costruirà usando ndk-build dalla riga di comando - Volevo fare un ulteriore passo avanti costruendo all'interno di Android Studio. Il mio progetto tenterà di disegnare un triangolo su un dispositivo GLES2.

Ecco un link al mio progetto in corso finora:

http://www.mediafire.com/download/92577p7vf123l72/hello-sdl-android.zip

risposta

2

Sì! L'ho capito: i file di origine SDL2 sono file .C, quindi i percorsi di inclusione devono essere dichiarati utilizzando CFlags, non cppFlags.

9

Io uso un approccio leggermente diverso:

cFlags += "-I" + file("src/main/jni/SDL2/include").absolutePath 

.. e questo funziona. Probabilmente il motivo è che il compilatore viene lanciato con una directory di lavoro diversa, e absolutePath risolve ogni ambiguità qui.

+0

Grazie - lo farò provalo tra un paio d'ore e facci sapere se questo ti aiuta. Cancellerò l'altra domanda se questa è la risposta. – SparkyNZ

+0

Questo non funziona ancora per me. In realtà, ho appena provato a inserire l'offendente #include "SDL_config.h" nel mio file main.cpp e sembra che lo stia raccogliendo bene. È quando sto compilando la sorgente SDL2 che ho un problema ..Quindi ho bisogno di un ulteriore "moduleName" o qualche forma di "sub" nome del modulo, forse? Sono confuso su cosa "moduleName" in realtà si riferisca comunque - sicuramente significa un eseguibile o una libreria - non un singolo file .cpp. Fornirò un link per il download a breve. Ottenere questo lavoro andrà a beneficio degli altri. – SparkyNZ

+0

Un'altra cosa: i file di origine SDL sono file C. Main.cpp è un file C++. Forse il mio problema è semplice come dichiarare "cFlags" oltre a "cppFlags"? – SparkyNZ

0

per molti percorsi di intestazione:

cFlags = "-I" + file("src/main/jni/path1").absolutePath + 
    " -I" + file("src/main/jni/path2").absolutePath + 
    " -I" + file("src/main/jni/path3").absolutePath 
1

Qui è un altro stile per ulteriori percorsi di intestazione utilizzando il plugin Gradle sperimentale, ad esempio con OpenSSL e alcuni biblioteca "abc":

// compile parameters 

// include openssl headers C (if you have C files) 
CFlags.add("-isystem${project.rootDir}/external-libraries/openssl/openssl-1.0.2g/include".toString()) 

// include openssl headers C++ (if you have cpp files) 
cppFlags.add("-isystem${project.rootDir}/external-libraries/openssl/openssl-1.0.2g/include".toString()) 

// include abc headers C (if you have C files) 
CFlags.add("-I${project.rootDir}/external-libraries/abc/abc-5.5/include".toString()) 

// include abc headers C++ (if you have cpp files) 
cppFlags.add("-I${project.rootDir}/external-libraries/abc/abc-5.5/include".toString()) 

// linking parameters 

// link libcrypto.so 
ldFlags.add("-L${project.rootDir}/external-libraries/openssl/openssl-1.0.2g/lib/armeabi-v7a".toString()) 
ldLibs.add('crypto') 

// link libabc.so 
ldFlags.add("-L${project.rootDir}/external-libraries/abc/abc-5.5/lib".toString()) 
ldLibs.add('abc')