Android NDK引用预编译的动态链接库
NDK里有个例子: android-ndk-r10/samples/module-exports/jni
一看就懂了
———————————————————————————–
从r5版本开始,就支持预编译的库(共享和静态). 也就是说在你的应用中,可包含和使用 预先编译的库。
这个功能的用处
1. 你想分发你自己的库给第3方 NDK开发者,但不想把源码给他们
2. 你想使用自己的预编译的库 来加速项目的Build过程。
声明一个预编译的库模块
每个预编译的库,都必须声明为一个独立的模块 给ndk build系统。
目录结构
mylib
--Android.mk
--libfoo.so
Android.mk的内容
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
注意事项
1. 每个预编译的模块都必须有一个名字, 比如上面取的名字是 foo-prebuilt
模块 名字 可以跟 预编译的库的名字 不一样(比如库的名字是 libfoo, 模块的名字是 foo-prebuild)
2. 设置 LOCAL_SRC_FILES 为你提供的预编译库的 路径。注意,这个路径 是相对于 LOCAL_PATH的。 据说也在 LOCAL_PATH/lib 目录里找源so.
另外: 如果你提供的库有多个ABI的版本,还要有点技巧,后面会提到。
3. 包含 PREBUILT_SHARED_LIBRARY (提供共享库) ; 或者 包含 PREBUILT_STATIC_LIBRARY(提供静态库)
在其他模块中 引用上面准备好的预编译模块
只需添加LOCAL_SHARED_LIBRARIES(或者 LOCAL_STATIC_LIBRARIES)声明 到你的 Android.mk中就行了
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
#LOCAL_LDLIBS := -lm -llog include $(BUILD_EXECUTABLE)
唯一要注意的是,引用 模块名(foo-prebuilt), 而不是库名(libfoo)
为预编译的库 输出头文件
在实际应用中, foo-user.c会依赖于 同库文件一起分发的头文件(foo.h)中声明的函数或变量
也就是说,在 foo-user.c 将会有如下代码
#include <foo.h>
构建你的foo-user模块时,必须提供 预编译模块的 头文件 以及 头文件的包含路径 给编译器。
假设头文件爱你 放在 预编译模块目录下的 include 目录, 我们可以在预编译模块的Android.mk中使用export
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)
LOCAL_EXPORT_C_INCLUDES 可以让 别的引用模块 找到 适合的头文件
别的引用模块,将在 自己的 Android.mk里用 LOCAL_C_INCLUDE 来找(好像不用声明这个, LOCAL_LDFLAGS也不用)
多种ABI
armeabi 目标CPU是ARM v5 TE或者之后的架构
armeabi-v7a 目标CPU是 ARM v7或者之后的架构
x86
mips
需要修改 预编译模块里定义的 LOCAL_SRC_FILES
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
Android NDK引用预编译的动态链接库的更多相关文章
- 在eclipse中配置android ndk的自动编译环境builders
无论linux还是mac在jni目录中直接运行 ndk-build 就可以生成 lib目录及所需要的 so文件: windows 装上lnx模拟器也是一样: 每次修改完 c++代码, 都要运行一下 ...
- android应用资源预编译,编译和打包全解析
我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件.这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的. ...
- Android NDK工程的编译和链接以及使用gdb进行调试
前提条件:已经安装了JDK 6.0.android SDK.NDK r9和eclipsele4.2开发环境. 推荐下载Android开发的综合套件adt-bundle-windows-x86,再下载A ...
- 〖Linux〗Android NDK调用已编译好的C/C++动态连接库(so文件)
一.背景:假定已有应用程序zigbeeclient.cpp,内容如下: ... extern "C" { int getresult(int argc, char **argv); ...
- android ndk opencv jni 编译集成
OpenCV (Open Source Computer Vision Library) https://docs.opencv.org/2.4/doc/tutorials/introduction/ ...
- 解决Android NDK 报jxxx编译找不到
如题 解决: 引入NDK对应的arm或者x86库 如果你用的是GinyMotion模拟器,那就引入x86库 不多说了,见截图 1.选择Propertities->C/C++ General-&g ...
- windows android ndk的某些编译工具报错乱码0x5 或拒绝访问05
在IDEA或者AndroidStudio的快捷方式上右键属性 > 兼容性 > 以管理员身份运行 解决问题.
- android ndk 编译 libevent
1. 下载 libevent 2.1.8 版本 https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/ ...
- Android NDK开发之Android.mk文件
Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南 Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...
随机推荐
- 【转载】about slack
About Slack slack is the difference b/w the REQUIRED TIME and the ARRIVAL TIME. 1.WHAT IS SLACK WITH ...
- mysql安装/启动报错汇总
2016/9/6补充 初始化报错: # /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysq ...
- C6011 正在取消对 null 指针的引用
- JFinal 源码分析 [DB+ActiveRecord]
我记得以前有人跟我说,“面试的时候要看spring的源码,要看ioc.aop的源码"那为什么要看这些开源框架的源码呢,其实很多人都是"应急式"的去读,就像读一篇文章一下, ...
- android开发 wifi开发不稳定性测试
场景:工厂定制机器,要求一个设备创建wifi热点,一个设备去连接.但是现在发现wifi连接很不稳定,主要以下3方面: 1.连接之前,不容易连接上 2.连接上之后,连不到外网 3.连接上之后,稳定性不好 ...
- PVPGN1.8.2 + D2GS1.11(38)搭建暗黑破坏神1.11b战网(配置指南)
首先介绍一下PVPGN和D2GS,PVPGN是一个多人网络游戏平台,全称是(Player vs Player Gaming Network),它的前身是Bnetd.Bnetd由于吃到暴雪的官司败诉,最 ...
- ZeroMQ 在 centos 6.5_x86_64 下的安装
ZeroMQ 在 centos 6.5_x86_64 下的安装 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.ZeroMQ介绍 ZeroMQ是一个开 ...
- Android开发-环境搭建以及HelloWorld
最近开始进行Android的开发,没有基础完全从0开始. 首先,知道Android开发的官方网站: http://developer.android.com/index.html 网站本身教程非常 ...
- ExtJS登陆页面涉及到的几个问题
1.如何在文本框中增加提示信息 输入框中无法直接使用tooltip,需要使用单独的代码 var tip = Ext.create('Ext.tip.ToolTip', { target : ...
- boost之function
boost中function是对函数指针和函数对象的进行封装的模板类. 定义示例:function<int()> func生成一个空的对象,表示函数参数个数为零,返回类型为int. #in ...