Android NDK 使用自己的共享库(Import Module)

简介:

 LOCAL_PATH := $(call my-dir)//标准mk语句,指编译路径,所有mk文件第一句都是这个

/**这个模块表示引用了一个本地的静态库
include $(CLEAR_VARS) //清除各种变量,因为这些变量是静态全局的,如果清除,下次编译时又会用到这些变量造成出错
LOCAL_MODULE    := libopencore-amrnb  //本地静态库模块的名字,这个名字在下面编译jni时需要引用
LOCAL_SRC_FILES := lib/libopencore-amrnb.a //本地静态库文件地址
include $(PREBUILT_STATIC_LIBRARY)  //PREBUILT_STATIC_LIBRARY表示先build一个静态库
**/

/**这个模块表示引用了一个本地的动态链接库
include $(CLEAR_VARS) //同上 www.2cto.com
LOCAL_MODULE    := libswscale  //本地动态库模块的名字
LOCAL_SRC_FILES := lib/libswscale.so //本地动态库文件位置
include $(PREBUILT_SHARED_LIBRARY) //表示先build这个动态链接库

 

http://blog.csdn.net/smfwuxiao/article/details/6591927

NDK r5 开始支持预编译共享库。预编译共享库就是从其他地方获得源码编译出的共享库,而不是Android系统自带的。方法如下:
1、声明共享库模块
把共享库声明为一个独立模块。假如 libfoo.so 与 Android.mk 位于同一目录。则 Android.mk 应该这样写:

[plain]  view plain copy
 
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. LOCAL_MODULE := foo-prebuilt     # 模块名  
  5. LOCAL_SRC_FILES := libfoo.so     # 模块的文件路径(相对于 LOCAL_PATH)  
  6.   
  7. include $(PREBUILT_SHARED_LIBRARY) # 注意这里不是 BUILD_SHARED_LIBRARY  

这个共享库将被拷贝到 $PROJECT/obj/local 和 $PROJECT/libs/<abi> (strip过的)

2、在其他模块中引用这个共享库
    在 Android.mk 中,将这个共享库的模块名加入 LOCAL_STATIC_LIBRARIES (静态库)或 LOCAL_SHARED_LIBRARIES (动态库)
例如, 使用 libfoo.so 的方法:

[plain]  view plain copy
 
  1. include $(CLEAR_VARS)  
  2. LOCAL_MODULE := foo-user  
  3. LOCAL_SRC_FILES := foo-user.c  
  4. LOCAL_SHARED_LIBRARY := foo-prebuilt  
  5. include $(BUILD_SHARED_LIBRARY)  

3、为共享库导出头文件

    这个共享库一般有相应的头文件,比如 libfoo.so 就有 foo.h。

一个简单方法(在Android.mk中写):    

[plain]  view plain copy
 
  1. include $(CLEAR_VARS)  
  2. LOCAL_MODULE := foo-prebuilt  
  3. LOCAL_SRC_FILES := libfoo.so  
  4. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include  
  5. include $(PREBUILT_SHARED_LIBRARY)  

    这样,使用该共享库的模块就会在它的 LOCAL_C_INCLUDES 变量加入该头文件搜索路径。
4、调试共享库
    建议你的共享库保留调试信息。 $PROJECT/libs/<abi> 目录下的共享库都是 strip 之后的(没有调试信息)。有调试信息的版本可被ndk-gdb使用。

5、共享库 ABI
    你的共享库与目标系统ABI的兼容性很重要。
    请检查 TARGET_ARCH_ABI,有以下值:
        armeabi      =>  ARMv5TE 以上
        armeabi-v7a  =>  ARMv7 以上
        x86              =>  x86
    建议: armeabi ABI 可以运行在所有 ARM CPU 上。



本文转自wanqi博客园博客,原文链接:http://www.cnblogs.com/wanqieddy/p/4514650.html,如需转载请自行联系原作者


相关文章
|
11月前
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
11月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
11月前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
11月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
712 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
12月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
369 1
|
11月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
584 0
|
开发工具 Android开发
解决Android Studio编译提示NDK is missing a “platforms“ directory
解决Android Studio编译提示NDK is missing a “platforms“ directory
519 1
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
337 4
|
Java Android开发
Android module的使用
Android module的使用
96 2