我查看了一下android的ndk目录,其中并没有stdarg.h这个头文件,而在<android.log.h>中却包含了这个头文件,而且编译没有任何问题,而如果我们自己编写的代码中包含了类似于<vector>这样的头文件,则编译的时候会报没有这个文件或文件夹的错误。请问这是为什么?我刚接触c和c++不久,对此不太了解。希望大侠解释一下!

解决方案 »

  1.   

    不知道你这个是不是在编译C文件的时候产生的错误?如果要编译C文件的话 在Android平台下面要调用GCC的东西,头文件不能用java里的。然后一般调用最好用“”不要用< >. 是在linux下编译的.
      

  2.   

    2楼貌似不对吧!用<>和""包含头文件的区别好像是<>代表的是系统提供的头文件,而用""包含的头文件则是自己定义的头文件。再说在java中有<vector>这个头文件吗????
      

  3.   

    locate stdarg.h
    找到目录
    编译时 -I 加进去就行了
      

  4.   

    5楼能详细解释一下吗?我的理解是,log.h中的文件已经通过编译,加载到相应的库里面了是吗?我们调用log.h只是做声明,而实际上是在相应的库中找到方法的实现的。如果我想在android的ndk中使用STL中的<vector>应该如何处理呢?谢谢了!
      

  5.   

    你的MK内容没说明.
    不过我估计是因为你的MK文件中
    LOCAL_C_INCLUDES :=
    这句没有优先把需要的头文件路径包含进去.
      

  6.   

    看来你并没有看懂我的意思。我说的是android的ndk提供的头文件中包含了某个头文件,但是这个头文件在ndk中找不到。但是编译正常。不知道你明白了我的意思吗?
      

  7.   

    哦,这样.
    请问你的NDK是在什么环境中搭建的呢?
    android/log.h中的源代码70行是#include <stdarg.h>.你是指这个吗?
    stdarg.h是C语言中C标准函式库的标头档,如果你下载了完整的NDRr5(我的是r5)该文件在NDK主目录下的sources\cxx-stl\stlport\stlport下和\sources\cxx-stl\gnu-libstdc++\include\tr1下.
    还有如果你是用Cygwin搭建的环境那么也会在Cygwin相关目录下.如果你系统还装了VS系列的IDE,那么也会存在stdarg.h这个文件.
    而#include <>中的<>是指优先通过系统环境变量PATH下去找,然后再从NDK编译器指定的INCLUDE路径中去找.如果你系统中环境变量所指的地方存在stdarg.h文件,你编译没有报错那是正常的.因为它的确找到了这个头文件.
    如果你想在android的ndk中使用STL中的<vector>
    请先在和Android.mk同级的目录下建立Application.mk文件,然后再加入如下语句.
    APP_STL := gnustl_static就可以了.如果还报找不到vector,那你就在LOCAL_C_INCLUDES :=
    中指明路径.我的路径是在NDKr5\sources\cxx-stl\gnu-libstdc++\include和NDKr5\sources\cxx-stl\stlport\stlport下.
      

  8.   


    哦!谢谢啊!看了你的回复,我明白很多了!我的编译环境是windows下结合Cygwin搭建的android_ndk开发环境。ndk的版本是r4,但是我的ndk的sources目录下只有一个cpufeatures的文件夹。我是需要自己下载sources目录下需要的资源吗?还是r4的版本就是这样啊?还有就是ndk编译时的include路径是在哪里设置的,我是说android_ndk默认的include路径是在哪里设置的。还有它的库文件和lib文件等的设置。比如说我想使用一个第三方的库,那我只需要把相应的头文件,lib文件和库文件放到对应的目录下就可以使用了吗?那编译出来的apk运行在android手机上时能找到这个第三方库吗?如果你知道,麻烦你回复我。谢谢!
      

  9.   

    r4我没有用,我一直用的r5,现在都有r6了.也正准备用r6.你下载了哪个版本应该就是完整的了.它们应该具备了最基本的头文件.在NDK编译时,默认的INCLUDE路径是在你的工程目录下的jni目录下的,也就是你的Android.mk文件同级的个目录中.这是NDK定的规范.但是你把所有的头文件放在这个目录下是不好管理的吧.如果你需要使用第三方库.这个库文件也可以随便放哪.只不过在编译时,在MK文件里需要用命令LOCAL_LDFLAGS导入库文件,此命令就是告诉编译器在连接目标代码时将导入库文件.比如:LOCAL_LDFLAGS := $(MY_LOCAL_LIB)/libvtl.so.记住在r5下不要用$(LOCAL_PATH)这个变量.否则可能会找不到库文件.你使用库的时候,只需要在你使用库的那个CPP中#include库的相关头文件即可.NDK是交叉编译器,编译成功后,会生成动态库.把这个动态放到你的ANDROID工程下的libs\armeabi目录下.(实际上你的NDK编译器会自动在jni的同级目录下生成libs\armeabi目录,并生成相应的目标动态库.),这样你的ANDROID工程编译整个项目的时候会把这个动态库打包进APK文件中相对应的目录中去.你JAVA层代表只需要在入口或需要用的时候用System.loadLibrary()方法导入就行了.比如System.loadLibrary("vtl");
      

  10.   


    好!谢谢你的回复!我明白了好多!以后有什么地方不明白,还要向你请教啊!我ndk刚刚接触,还有很多地方不太懂。