6

Android Studioは、自分のモジュールのメインソースフォルダと異なる場所にある場合、ヘッダファイルを見つけることができません。これは#include "SDL_config.h"ステートメントが赤で強調表示されていることで目立つ(他の#include文は問題ありません)。Gradle Experimental PluginでC/C++インクルードパスを設定するにはどうすればよいですか?

私は以下のcppFlagsの値を変更しようとしましたが、これらのcppFlagsがコンパイラにまったく渡されていないか疑問に思っています。

誰も、この方法でメインのソースフォルダ以外のフォルダからファイルを含むことができましたか?

私はcppFlags、またはおそらくmoduleNameまたはソースを指定した方法に問題がありますか?

私はSDL2ソースを経由してすべての#includeステートメントを相対#includeパスに変更できますが、SDL2ソースを変更する必要はありません。私は単純にインクルードパスのリストを何らかの形で指定できるはずです。

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:ここに私の現在のプロジェクトのレイアウトについての詳細は:

アプリ/ srcに/メイン/ JNI アプリ/ srcに/メイン/ JNI/SRC/main.cppに< - これは アプリをコンパイルしています/ srcに/メイン/ JNI/SDL2 < - すべてSDL2ソースがアプリ/ srcに/メイン/ JNI/GLM < ここの下にある - すべてのGLMソースがこのレイアウトは、どのプロジェクト例を使用しての直接の結果である、ここで

の下にあります私はここに提供された:https://gitlab.com/scannerdarkly/hello-sdl-android

このプロジェクトは、コマンドラインからndk-buildを使用してビルドされます。私は、Android Studio内でビルドすることでさらにステップを進めたいと考えていました。私のプロジェクトは、GLES2デバイスに三角形を描画しようとします。 ..

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

、これは動作します:

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

答えて

2

はい!私はそれを理解しました - SDL2ソースファイルは.Cファイルなので、インクルードパスはcppFlagsではなくCFlagsを使って宣言する必要があります。多くのヘッダーパスの

9

私は少し異なるアプローチを使用します。ここでは

は、これまでのところ、私の現在のプロジェクトへのリンクです。その理由はおそらく、コンパイラが異なる作業ディレクトリで起動されており、 absolutePathがここでのあいまいさを解決するからです。

+0

おかげで - 私はします数時間でこれを試してみて、それが役立つかどうかを知らせてください。これが答えであれば、私は他の質問を削除します。 – SparkyNZ

+0

まだそれは私のために働いていません。実際には、私は問題を#include "SDL_config.h"をmain.cppファイルに入れようとしましたが、それはうまくいきます。 SDL2のソースをコンパイルしているときに問題が発生しました。だから私は追加の "moduleName"または何らかの形の "sub"モジュール名が必要でしょうか?私は、実際には "moduleName"が実際に何を指しているのか混乱しています。確かに、それは個々の.cppファイルではなく、実行可能ファイルまたはライブラリを意味します。私はまもなくダウンロードリンクを提供します。これを有効にすることは、他の人に有益です。 – SparkyNZ

+0

もう1つ - SDLソースファイルはCファイルです。Main.cppはC++ファイルです。たぶん私の問題は "cppFlags"に加えて "cFlags"を宣言するのと同じくらい簡単ですか? – SparkyNZ

0

:ここ

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

はGradleの実験的なプラグインを使用して、よりヘッダーパスの別のスタイル、opensslのといくつかの「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') 
関連する問題