2016-04-05 4 views
0

Android NDK(初めての使用)と簡単なCファイルのコンパイルにいくつか問題があります。奇妙なことは、標準のヘッダーファイル自体にこれらのコンパイルエラーがあることです。これらのコンパイルエラーは、インクルードファイルがすべて含まれていない限り、これらのファイル内でエラーが生成されることはありません。ここに私がしたものがあります...Android NDK標準ヘッダファイルコンパイルエラー

javac myJavaFile.java 
javah -d location/include location.MyJavaFile 

これはうまく動作し、適切なヘッダーファイルを作成します。私はその後、私の関連するCファイルでアンドロイドndkのCコンパイラを実行するが、私は標準のヘッダーファイルにエラーが発生します。次のように私のコマンドがある(読みやすくするための絶対パスを短縮)

...android-ndk-r11c-windows-x86_64\android-ndk-r11c\toolchains\x86_64-4.9\prebuilt\ 
windows-x86_64\bin\x86_64-linux-android-gcc.exe -I ...jdk1.6.0_35\include -I 
...android-ndk-r11c-windows-x86_64\android-ndk-r11c\platforms\android-18\arch-x86\usr\ 
include -I ...jdk1.6.0_35\include\win32 -c myCFile.c 

これをやったときに、私は次のように生成されたエラーを取得:

C:\Program Files\Java\jdk1.6.0_35\include/jni.h:621:25: error: expected ')'  before '*' token 
jcharArray (JNICALL *NewCharArray) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:623:26: error: expected ')' before '*' token 
jshortArray (JNICALL *NewShortArray) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:625:24: error: expected ')' before '*' token 
jintArray (JNICALL *NewIntArray) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:627:25: error: expected ')' before '*' token 
jlongArray (JNICALL *NewLongArray) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:629:26: error: expected ')' before '*' token 
jfloatArray (JNICALL *NewFloatArray) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:631:27: error: expected ')' before '*' token 
jdoubleArray (JNICALL *NewDoubleArray) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:634:25: error: expected ')' before '*' token 
jboolean * (JNICALL *GetBooleanArrayElements) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:636:22: error: expected ')' before '*' token 
jbyte * (JNICALL *GetByteArrayElements) 
       ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:638:22: error: expected ')' before '*' token 
jchar * (JNICALL *GetCharArrayElements) 
       ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:640:23: error: expected ')' before '*' token 
jshort * (JNICALL *GetShortArrayElements) 
       ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:642:21: error: expected ')' before '*' token 
jint * (JNICALL *GetIntArrayElements) 
       ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:644:22: error: expected ')' before '*' token 
jlong * (JNICALL *GetLongArrayElements) 
       ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:646:23: error: expected ')' before '*' token 
jfloat * (JNICALL *GetFloatArrayElements) 
       ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:648:24: error: expected ')' before '*' token 
jdouble * (JNICALL *GetDoubleArrayElements) 
        ^
C:\Program Files\Java\jdk1.6.0_35\include/jni.h:651:19: error: expected ')' before '*' token 
void (JNICALL *ReleaseBooleanArrayElements) 
      ^
    C:\Program Files\Java\jdk1.6.0_35\include/jni.h:653:19: error: expected ')' before '*' token 
void (JNICALL *ReleaseByteArrayElements) 
^ 
    C:\Program Files\Java\jdk1.6.0_35\include\win32/jni_md.h:11:19: error: expected declaration specifiers before '__declspec' 
#define JNIEXPORT __declspec(dllexport) 

だから私はここで間違って何をやっていますか?間違ったコンパイラ?インクルードファイル、jni.hは存在します。私はWindows 7 Pro 64ビットで動作しています。

答えて

3

Windows JDKバージョンのjni.hが含まれているようです。ターゲットプラットフォーム用にNDKに同梱されているバージョンを含める必要があります。たとえば、ARMデバイスでGingerbreadをターゲットにしている場合は、プラットフォーム/ android-9/arch/arm/usr/include/jni.hを使用します。

しかし、Cコンパイラを直接起動しているということは、あなたが苦労していると思います。 NDKはちょっとしたツールチェーンです。それが発行するコードは、Dalvik実行可能ファイルに動的にリンクされるため、gccオプションを正しく設定するか、読み込まないようにする必要があります。 これは通常のLinuxのツールチェーンではありません。長い間、Googleの一人だけがNDKビルドシステムを理解していて、すべてのNDKリリースをデスクトップ上に構築しなければならない、あるいはうまくいかないという(おそらく外典的な)話があります。 ;-)

ndk-buildスクリプトまたはAndroid Studio gradle plugin(現在はまだ実験中と表示されている2016年4月)を使用して開始することをおすすめします。ツールチェーンがどのように機能するかを理解したら、好みに合わせてシステムを変更することができます。

+0

ありがとうございました!それが私の必要なものです!あなたの助けをありがとう! –