`
dingran
  • 浏览: 376188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android.mk中LOCAL_EXPORT_C_INCLUDES的作用

    博客分类:
  • ndk
 
阅读更多

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$ 

 

        好了,验证了。再次感谢那哥们的翻译,真是太好了。

 

 

 

分享到:
评论

相关推荐

    cocos2dx、android.mk文件通用写法LOCAL_C_INCLUDES使用技巧

    制作了一个全平台通用的Android.mk文件。(MK文件是很容易出错的东西,调试需要花费很长的时间)。需要的同学可以借鉴一下。 使用它了make写法,全平台通用。...LOCAL_C_INCLUDES、LOCAL_SRC_FILES使用技巧。

    Android.mk文档规范

    - **LOCAL_EXPORT_C_INCLUDES**:导出当前模块的头文件路径,供其他模块使用。 #### 六、总结 通过以上介绍,我们可以看到 Android.mk 文件对于管理 C/C++ 项目具有重要作用。它不仅帮助开发者组织源代码,还提供...

    Android_makefile编译系统_Android.mk_文件语法规范

    在深入探讨`Android.mk`文件的语法和规范之前,我们假设读者已经熟悉了Android NDK的基本概念及其在构建过程中的作用。`Android.mk`文件是Android NDK项目中不可或缺的一部分,它主要用来描述项目的C/C++源代码,...

    ffmpeg移植android需要的android.mk

    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) ``` 这段代码声明了一个预构建的共享库模块,并指定了库文件和头文件路径。 7. **应用集成**:在Android Studio项目中...

    android的MK文件编写规范

    在Android开发中,Android.mk文件是一个关键的构建脚本,它是Android NDK(Native Development Kit)的一部分,用于编译C/C++代码并生成本地库,这些库可以与Java代码一起使用,实现JNI(Java Native Interface)...

    protobuf-2.6.1

    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../Classes/ohters/protobuf-2.6.1 \ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \ $(LOCAL_PATH)/../../Classes/utils \ $(LOCAL_PATH)/../../Classes/...

    ffmpeg ndk编译目录结构以及Android.mk

    LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/include LOCAL_LDLIBS := -llog LOCAL_CFLAGS += $(MY_FFMPEG_CFLAGS) include $(BUILD_SHARED_LIBRARY) ``` 这段脚本定义了一个名为`ffmpeg`的共享库模块,源文件...

    Android 配置 libwebp.so 项目源码 ( 兼容 4.0 以下版本 )

    为了在Android应用中使用WebP图像,我们需要配置libwebp库,这是一个C语言编写的开源库,提供了解码和编码WebP图像的功能。在本文中,我们将详细讲解如何在兼容Android 4.0(API级别14)及以下版本的项目中配置...

    Android_C编译

    - **`LOCAL_EXPORT_C_INCLUDES`**: 导出头文件目录供其他模块使用。 - **`LOCAL_STATIC_LIBRARIES`**: 指定需要链接的静态库。 - **`LOCAL_WHOLE_STATIC_LIBRARIES`**: 指定静态库的完整链接,而非默认的部分链接。 ...

    android下编译C以及动态库调用.pdf

    1. 在`Android.mk`文件中直接指定动态库的存放路径,例如`/opt/EmbedSky/TQ210/TQ210_Android_4.0.4_V1.4/out/target/product/tq210/system/lib`。 2. 在源代码中使用`dlopen`函数动态加载库。 在编写`Android.mk`...

    android下编译C以及动态库调用定义.pdf

    - `LOCAL_SRC_FILES`定义源文件列表,`LOCAL_C_INCLUDES`添加头文件路径,`LOCAL_MODULE`指定模块名称,`BUILD_EXECUTABLE`表示编译为可执行程序。 - 对于静态库,使用`BUILD_STATIC_LIBRARY`,动态库则使用`BUILD...

    Linux使用NDK编译libtiff库并移植到Android平台

    5. `LOCAL_C_INCLUDES := $(LOCAL_PATH)/include`:添加头文件路径。 6. `LOCAL_LDLIBS := -lz -llog`:链接所需的库,`-lz`表示zlib,如果libtiff依赖其他库,也需要在这里添加。 7. `LOCAL_STATIC_LIBRARIES := `...

    pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z

    在Android源码树中添加userspace I2C读写工具(i2c-util) 本文使用的开发板是:杭州若格科技有限公司的全志R8。CPU:CPUARM Cortex-A8 更多芯片资料请参见全志官网: http://www.allwinnertech.com/clq/r/R8.html...

    openssl-android-master-master

    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_STATIC_LIBRARY) ``` 这段代码告诉NDK哪些文件是库,以及包含的头文件位置。 五、构建Android工程 1. 将编译好的OpenSSL库文件复制到...

    libcurl在android下的移植、编译与测试源码

    LOCAL_EXPORT_C_INCLUDES := path/to/libcurl/include include $(BUILD_STATIC_LIBRARY) ``` 2. **链接应用**:在应用程序的Android.mk或CMakeLists.txt文件中,链接libcurl库并包含所需的头文件。 3. **编写源码...

    Android编译系统

    - **LOCAL_EXPORT_C_INCLUDES**:指定编译时需要包含的头文件路径。 - **LOCAL_LDLIBS**:定义链接阶段需要包含的库文件。 #### 四、多发布版本的支持 Android系统支持多种发布版本,以适应不同厂商的需求。这通常...

    如何用ndk编译安卓下poco

    LOCAL_CFLAGS := -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY LOCAL_CPPFLAGS := -frtti -fexceptions LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_SRC_FILES := \ ...

    android ffmpeg

    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/prebuilt/ffmpeg/include include $(PREBUILT_SHARED_LIBRARY) ``` 6. **构建Android项目**:在Android Studio或Eclipse中,通过NDK的`ndk-build`命令编译项目,将...

    iperf 测试工具

    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include include $(BUILD_EXECUTABLE) ``` 4. **配置NDK路径**:确保`ANDROID_NDK`环境变量指向你的NDK安装路径。 5. **编译iperf3**:在Android源码根目录运行以下命令来...

Global site tag (gtag.js) - Google Analytics