NDK 编译静态库 fatal error: xx.h: No such file or directory

来源:互联网 发布:java命令行打包jar 编辑:程序博客网 时间:2024/06/18 07:35

        先说下背景吧,有个Android工程用到好几个开源的C++的库,用NDK去做,还是按照普通的NDK的编译方式去编译,android.mk文件里  LOCAL_SRC_FILES 有长长的一条编译时候报错:

arm-linux-androideabi-g++.exe: CreateProcess: No such file or directorymake: *** [/cygdrive/...] Error 1
google了一番说可能是路径过长之类的(还希望大神拍砖纠正真正的原因),我暂时愉快的接收了这个原因,确实是当编译文件达到一定数量后报的这个错,那决定把一些文件通过import的方式以静态库的方式加入到工程中。

第一步:将开源库的源文件拷贝到NDK的安装目录\source文件夹下,命名native_app_glue,并编写android.mk文件(与直接在android工程下编译写法差不多),我将完全按照eclipse下工程里的方式编写另一个mk文件(最终引发了一个悲剧,下边会说到)

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= native_app_glue
LOCAL_SRC_FILES:= android_native_app_glue.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
第二步:在android工程中引用这个静态库,android.mk里类似这样:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := native-activity
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,native_app_glue)

标红的两段为导入静态库语句,NDK默认会去“NDK的安装目录\source”文件下找相关的库,当然也可以对路径进行设置,这个大家可以google下。

感觉这样应该可以,然后编译,但是悲剧的是 报错: fatal error: xx.h: No such file or directory我在ndk中引用的静态库的头文件找不到,但是静态库确实能够编译。就郁闷了,然后继续google,发现原来NDK的例子中已经有一个类似的例子,在ndk安装目录\samples\native-activity,运行,一切OK。说明这条路是可以走通,因此仔细比较两份编译文件,后来发现了悲剧源头,开源库mk文件需要修改下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= native_app_glue
LOCAL_SRC_FILES:= android_native_app_glue.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)

将静态库的头文件要搞出来,才能访问的到。

对于LOCAL_EXPORT_C_INCLUDES作用可以看下:http://www.iteye.com/topic/1129016

这是我被虐和修改的过程,刚刚接触,理解和水平有限希望各种拍砖。