Android NDK 标准头文件编译错误

Android NDK Standard Header File Compile Errors

我在使用 Android NDK(第一次)和编译一个简单的 C 文件时遇到了一些问题。奇怪的是,我在标准头文件本身上得到了这些编译错误,我希望在这些文件中不会产生任何错误,除非我没有包含所有包含文件。这是我所做的...

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

这 运行 没问题,并创建了适当的头文件。然后,我在关联的 C 文件上 运行 android 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 位。

您似乎包含了 jni.h 的 Windows JDK 版本。您应该为您的目标平台包括随 NDK 一起提供的版本。例如,如果您要在 ARM 设备上定位 Gingerbread,请使用 platforms/android-9/arch/arm/usr/include/jni.h.

但是您直接调用 C 编译器这一事实让我认为您可能会遇到困难。 NDK 是一种挑剔的工具链。它发出的代码旨在动态链接到 Dalvik 可执行文件中,因此它需要正确设置其 gcc 选项,否则将不会加载。 这不是一个正常的 Linux 工具链。 有一个(可能是杜撰的)故事,很长一段时间只有 Google 的一个人了解 NDK 构建系统,并且每个 NDK 版本都必须在他的桌面上构建,否则将无法运行。 ;-)

我建议您首先使用 ndk-build 脚本或 Android Studio gradle plugin,目前(2016 年 4 月)仍标记为 "experimental." 一旦您了解工具链的工作原理,然后您可以根据自己的喜好切换到 make 系统。