2016-04-05 4 views
0

Ich habe einige Probleme mit dem Android NDK (zum ersten Mal) und kompilieren eine einfache C-Datei. Das Seltsame ist, dass ich diese Kompilierungsfehler auf den Standard-Header-Dateien selbst bekomme, von denen ich erwarte, dass keine Fehler in diesen generiert werden, wenn ich nicht alle Include-Dateien einschließe. Hier ist, was ich getan habe ...Android NDK Standard Header Datei kompilieren Fehler

Dies läuft gut und erstellt die entsprechende Header-Datei. Ich führe dann den Android ndk C-Compiler auf meiner verbundenen C-Datei aus, aber ich bekomme Fehler in den Standard-Header-Dateien. Mein Befehl lautet wie folgt (verkürzt absolute Pfade zur besseren Lesbarkeit)

...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 

ich die folgenden Fehler verursacht werden, wenn dies zu tun:

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) 

Also, was ich falsch hier? Falscher Compiler? Include-Datei, jni.h existiert. Ich laufe auf Windows 7 Pro 64 Bit.

Antwort

3

Es sieht so aus, als ob Sie die Windows JDK-Version von jni.h. Sie sollten die Version einschließen, die mit dem NDK für Ihre Zielplattform geliefert wird. Wenn Sie beispielsweise Gingerbread auf einem ARM-Gerät verwenden, verwenden Sie platforms/android-9/arch/arm/usr/include/jni.h.

Aber die Tatsache, dass Sie den C-Compiler direkt aufrufen, lässt mich denken, dass Sie für eine harte Zeit sind. Das NDK ist eine Art raffinierte Toolchain. Der Code, den er aussendet, soll dynamisch in eine Dalvik-Datei eingebunden werden, so dass die gcc-Optionen genau richtig eingestellt sein müssen oder nicht geladen werden. Es ist keine normale Linux Toolchain. Es gibt eine (möglicherweise apokryphe) Geschichte, dass lange Zeit nur eine Person bei Google das NDK-Build-System verstand, und jede NDK-Version musste auf seinem Desktop erstellt werden oder es würde nicht funktionieren. ;-)

Ich würde dir raten, mit dem ndk-build script oder dem Android Studio gradle plugin anzufangen, das derzeit (April 2016) noch als "experimental" bezeichnet wird. Wenn Sie einmal verstanden haben, wie die Toolchain funktioniert, können Sie nach Ihren Wünschen zu einem neuen System wechseln.

+0

Vielen Dank! Genau das habe ich gebraucht! Danke für all deine Hilfe! –