Android NDK标准头文件编译错误

时间:2016-04-05 14:31:53

标签: android c compiler-errors android-ndk header-files

我在使用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位。

1 个答案:

答案 0 :(得分:3)

看起来你包含了jni.h的Windows JDK版本。您应该将NDK附带的版本包含在目标平台中。例如,如果您在ARM设备上定位Gingerbread,请使用platforms / android-9 / arch / arm / usr / include / jni.h。

但是你直接调用C编译器的事实让我觉得你可能会遇到困难。 NDK是一种挑剔的工具链。它发出的代码旨在动态链接到Dalvik可执行文件,因此需要将其gcc选项设置得恰到好处,否则它将无法加载。 这不是一个普通的Linux工具链。有一个(可能是伪造的)故事,很长一段时间以来只有一个人了解NDK构建系统,并且每个NDK版本都必须建立在他的桌面上或它不会起作用。 ; - )

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