Android.mk中LOCAL_EXPORT_C_INCLUDES的作用
NDK中的说明是这样说明的:
III. Exporting headers for prebuilt libraries: ---------------------------------------------- The example above was called 'naive' because, in practice, the code in foo-user.c is going to depend on specific declarations that are normally found in a header file distributed with the prebuilt library (e.g. "foo.h"). In other words, foo-user.c is going to have a line like: #include <foo.h> And you need to provide the header and its include path to the compiler when building the foo-user module. A simple way to deal with that is to use exports in the prebuilt module definition. For example, assuming that a file "foo.h" is located under the 'include' directory relative to the prebuilt module, we can write: include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := libfoo.so LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) The LOCAL_EXPORT_C_INCLUDES definition here ensures that any module that depends on the prebuilt one will have its LOCAL_C_INCLUDES automatically prepended with the path to the prebuilt's include directory, and will thus be able to find headers inside that.
如果看不懂就看这个博客的翻译吧,非常好:
http://www.cnblogs.com/qq78292959/archive/2011/11/02/2232962.html
感谢这哥们将NDK的文档都翻译了,高质量,高水平。
我当时情况是,如果我们自己的c或cpp中如果引用了其他库使用的头文件,那么例如:
我的jni_main.cpp中#include "openssl/ssl.h",那么我拷贝到jni下的应该是openssl目录,里面包含这这个
ssl.h头文件,那么我就不用使用这个LOCAL_EXPORT_C_INCLUDES也可以正常编译使用。很明显是正确的。
那么这个东西是干嘛用的呢?我就猜想,一般大家都把头文件放到叫include的目录中,比如Android源码里的external/openssl/下面的include中有/openssl/ssl.h,看来如果尊重这个习惯的话,那么使用这个变量不就很好了嘛,可以让ndk去include下面去找openssl啊,如果还要其他的模块,把他们的头文件也放到include中,也能集中啊,多么美好的东西啊。
实践一下吧:
1.先将external/openssl/下面的include目录整体拷贝到工程的jni目录下,然后在Android.mk中修改如下:
#使用动态库 include $(CLEAR_VARS) LOCAL_MODULE := openssl_ssl LOCAL_SRC_FILES := ./openssllibs/libssl.so # 导出头动态库的文件 LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include # 预编译动态库 include $(PREBUILT_SHARED_LIBRARY) #使用动态库 include $(CLEAR_VARS) LOCAL_MODULE := openssl_crypto LOCAL_SRC_FILES := ./openssllibs/libcrypto.so # 导出头动态库的文件 LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include # 预编译动态库 include $(PREBUILT_SHARED_LIBRARY)
用ndk编译之,ok结果如下:
dr@dr-OptiPlex-3010:~/workspace/OpensslTest/jni$ ~/android-ndk-r5b/ndk-build Compile++ thumb : jni_openssltest <= jni_main.cpp StaticLibrary : libstdc++.a Prebuilt : libssl.so <= jni/./openssllibs/ Prebuilt : libcrypto.so <= jni/./openssllibs/ SharedLibrary : libjni_openssltest.so Install : libjni_openssltest.so => libs/armeabi/libjni_openssltest.so Install : libcrypto.so => libs/armeabi/libcrypto.so Install : libssl.so => libs/armeabi/libssl.so dr@dr-OptiPlex-3010:~/workspace/OpensslTest/jni$
那如果不使用这个LOCAL_EXPORT_C_INCLUDES呢?结果当然不行了,如下:
dr@dr-OptiPlex-3010:~/workspace/OpensslTest/jni$ ~/android-ndk-r5b/ndk-build Compile++ thumb : jni_openssltest <= jni_main.cpp /home/dr/workspace/OpensslTest/jni/jni_main.cpp:3:25: error: openssl/ssl.h: No such file or directory /home/dr/workspace/OpensslTest/jni/jni_main.cpp: In function 'jint Java_com_example_openssltest_JniTest_getInit(JNIEnv*, _jobject*)': /home/dr/workspace/OpensslTest/jni/jni_main.cpp:15: error: 'SSL_library_init' was not declared in this scope make: *** [/home/dr/workspace/OpensslTest/obj/local/armeabi/objs/jni_openssltest/jni_main.o] Error 1 dr@dr-OptiPlex-3010:~/workspace/OpensslTest/jni$
好了,验证了。再次感谢那哥们的翻译,真是太好了。
相关推荐
制作了一个全平台通用的Android.mk文件。(MK文件是很容易出错的东西,调试需要花费很长的时间)。需要的同学可以借鉴一下。 使用它了make写法,全平台通用。...LOCAL_C_INCLUDES、LOCAL_SRC_FILES使用技巧。
3.Android.mk或Android.bp中引用Android的第三方(jar、aar、so)、Androidx的类库等的使用方法 4.Android.mk或Android.bp编译生成Apk、静态库、动态库、可执行文件等的使用方法 5.Android系统定制有源码App或无源码...
Android.mk语法说明(android ndk开发),ndk开发必知必会!
已经添加有Android.mk,可放到android目录下编译到系统中使用,不过只写了iwconfig和iwlist命令,欢迎大家把其他的也加进来给我
Android_makefile编译系统_Android.mk_文件语法规范 对Android.mk的讲解,共9页,值得一看。
将android.mk转换为android.bp
_storage_emulated_0_android_data_com.tencent.mobileqq_Tencent_QQfile_recv_.TbsReaderTempcom.tencent.mobileqq_83ca8a5fc862397bd03b8fa8d9944926.dat
里面有所有的Android.mk与Android.bp示例。不会写Android.mk与Android.bp,或者常有编译问题的可以下载参考,解决无法使能ASAN的问题。不会用的一定要展开下面链接看使用方法,以及编译问题示例,别啥也不懂就开始...
PCM转换AAC音频格式的一个C开源库,Android移植版本faac-1.28。
android编译系统makefile(Android.mk)写法 Android.mk文件首先需要指定LOCAL_PATH变量,用于查找...Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始 以include $(BUILD_XXX)结束。
android studio 配置gradle 使用android.mk进行编译jni,简单的jni调用,使用android.mk进行编译,注意事项:app下的gradle,以及编译生成的 .h文件,复制修改为 .cpp时,里面的文件的宏逻辑,最好去掉这个宏(#...
android openssl 静态库 需要在Application.mk 中置 APP_PLATFORM := android-8,即最低支持android2.2系统,另外在Android.mk中设置连接库,添加两行 LOCAL_EXPORT_LDLIBS := -lz LOCAL_LDLIBS := -lz –ldl
android 拷贝文件的mk脚本,bin,lib
自动生成android.mk文件,方便,快捷
或直接把目标系统的签名证书platform.pk8和platform.x509.pem(根据android.mk文件的LOCAL_CERTIFICATE 定义,也可能是shared.pk8、media.pk8等)覆盖到build\target\product\security也可,这样就不需要再手工签名了...
LOCAL_C_INCLUDES := \ $(LOCAL_PATH) \ $(LOCAL_PATH)/.. LOCAL_CFLAGS := -DHAVE_AV_CONFIG_H -std=c99 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8 LOCAL_LDLIBS := -lz TARGET_...
全面介绍Android.mk文件语法规范
pmd_import_export_v04-mk64n
USB encoder volume regulator