我在使用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位。
答案 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月)仍然标记为“实验性”。一旦了解了工具链的工作原理,就可以根据自己的喜好切换到制作系统。