Android中集成第三方库的方法和问题
Android中集成第三方库的方法和问题
声明:
1.
本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接。
2.
本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部分为參考网上同学们的成果加以整理而成。
3. 欢迎转载,交流,请尊重作者劳动成果;转载请注明出处,谢谢!
Android中使用第三方库可能有两种:Java库.jar和原生库.so/.a,假设仅仅是做上层APK开发,这两种库都能够通过Eclipse集成开发环境进行集成,假设是平台级开发,则都可通过源代码集成。本文整理这两种集成方式使用步骤,下面假设程序scanerapp,集成Java库scanerjar.jar,原生库libscanerbase.so/libscanerbase.a,libscanerplus.so/libscanerplus。当中,so库要尽量參照Android引用库规范编写,内部函数命名也要规范(虽然不规范也可能能够使用),.a库为静态联编,一般面向C/C++引用使用,假设Java上层使用,一般须要通过动态库(.so)转接。
一、Eclipse集成
1、scanerjar.jar包集成
A.当前projectscanerapp下创建libs文件夹
B.使用Eclipse导入scanerjar.jar包就可以
2、libscanerbase.so和libscanerplus.so集成
A.当前projectscanerapp下创建libs/armeabi文件夹
B.把libscanerbase.so和libscanerplus库文件复制到libs/armeabi文件夹下就可以,由于libscanerbase.so和libscanerplus.so库为原生库,一般做执行时载入的动态库。
C.Java文件引用载入库
终于生成的apk会自己主动把libscanerjar.jar和libscanerbase.so和libscanerplus.so文件打包进去。
二、源代码集成
源代码集成第三方库也至少有两种方式:C/C++链接方式和Android Prebuild方式,当然似乎前者无法集成libscanerjar.jar包。C/C++方式
1、C/C++链接方式
静态库和动态库一般放置在libs/armeabi文件夹下,假设库文件较多,也能够单独另立文件夹存放,仅仅要相应改动库文件路径(搜索路径就可以)。
改动Android.mk文件,演示样例链接libscanerbase.a静态库:
LOCAL_LDFLAGS := $(LOCAL_PATH)/libs/armeabi/libbase.a
2、Android Prebuild方式
1) libscanerbase.jar包集成
A.在packages/app/scanerapp下创建libs文件夹,这里如果程序包放在packages/app以下。
B.把scanerbase.jar包复制到该文件夹下
C.改动Android.mk文件,示比例如以下:
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES := scanerjar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=scanerjar:libs/libscaner.jar
include $(BUILD_MULTI_PREBUILT)
当中,
LOCAL_STATIC_JAVA_LIBRARIES为引用jar库的别名,能够随便取名,一般就是用库名称就能够了。
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES为指定prebuilt java库规则,格式为:别名:jar文件的完整路径,这里的别名就是LOCAL_STATIC_JAVA_LIBRARIES所取的名字。
源代码开发时,scanerapp.apk将会连同libscaner.jar打包,一起放在out/target/product/<prjname>/system/app/文件夹下;
2) libscanerbase.so和libscanerplus.so集成
A.在packages/app/scanerapp下创建libs/armeabi文件夹
B.把.so库复制到libs/armeabi文件夹下
C.改动Android.mk配置文件,加入例如以下:
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libscanerso
LOCAL_PREBUILT_LIBS := libscanerso:libs/armeabi/libscanerbase.so libs/armeabi/libscanerplus.so
include $(BUILD_MULTI_PREBUILT)
当中,
LOCAL_PREBUILT_LIBS指定prebuilt so库规则,格式:别名:so文件路径。
源代码开发时,这个libscanerbase.so将会被放在out/target/product/<prjname>/system/lib/下,当中system/lib为载入动态库时缺省搜索路径。
此外,libscanerbase.so还能够集成到build/core/user_tags.mk中,只是一般不建议那么做,我们应尽量降低改动系统级配置。
3) 源代码集成编译
mmm /packages/apps/scanerapp
以上指令是在展讯ANDROID平台上使用,其他平台可能不同。
三、easy出现故障的点及解决的方法
在将库文件加入到Eclipse项目中时,一定要注意加入库的位置,不能放错,否则不能被正常使用。Jar包放在libs/文件夹下,so库文件一定要放在libs/armeabi文件夹下。
2.集成库文件到源代码中
在源代码集成环境中(我们的平台为展讯平台),其它平台能够參考
(1) 在应用文件夹(scanerapp)下的Android.mk文件里,在引用多个库的时候,库文件的别名能够不声明,可是假设声明了别名,就一定要注意该问题:别名后要将全部引用的库都写上,及一个别名后加入全部要引用的库。
比如:
应写成例如以下格式:
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES := scanerjar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=scanerjar:libs/libscaner.jar libs/libscanerplus.jar #问题点
include $(BUILD_MULTI_PREBUILT) include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libscanerso
LOCAL_PREBUILT_LIBS := libscanerso:libs/armeabi/libscanerbase.so libs/armeabi/libscanerplus.so #问题点
include $(BUILD_MULTI_PREBUILT)
而不能写成以下的格式:
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES := scanerjar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=scanerjar:libs/libscaner.jar scanerjar:libs/libscanerplus.jar #注意问题点
include $(BUILD_MULTI_PREBUILT) include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libscanerso
LOCAL_PREBUILT_LIBS := libscanerso:libs/armeabi/libscanerbase.so libscanerso:libs/armeabi/libscanerplus.so #注意问题点
include $(BUILD_MULTI_PREBUILT)
(2) 在应用包中有使用jni代码的情况,在软件包jni文件夹下的(scanerapp/jni)Android.mk中要參考例如以下声明方式:
include $(CLEAR_VARS) LOCAL_MODULE := libscanerjni
LOCAL_SRC_FILES := scaner.cpp
LOCAL_LDLIBS := -llog LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY)
当中,LOCAL_MODULE会被应用所使用,LOCAL_MODULE_TAGS一定要申明,否则编译时会报错,不能进行编译。
在应用(scanerapp)文件夹下的Android.mk文件里一定要声明LOCAL_JNI_SHARED_LIBRARIES,示比例如以下:
LOCAL_JNI_SHARED_LIBRARIES := libscanerjni
LOCAL_PROGUARD_ENABLED := disabled
当中libscanerjni为应用(scanerapp/jni)文件夹下Android.mk文件里申明的Jni模块。
假设应用的包,在编译时提示proguard错误,则要将LOCAL_PROGUARD_ENABLED设置为disabled;
(3)依照该规则正确写了Android.mk文件,使用mmm单独编译scanerapp也能正常编译通过,可以正常看到提示已经将所用到的so库文件copy到out/…/system/libs文件夹下。可是将整个项目全编时,却发现out/…/system/libs文件夹下并没有我们所须要的.so库文件。出现这样的情况,可进行例如以下操作,(展讯平台可照搬,其它平台可參考,思路是一样的)
第一:将所要引用的so文件复制到project/vendor/sprd/proprietaries/<projectName>/system/lib文件夹下
第二:打开project/device/sprd/<prjecetName>/proprietaries.mk
将索要引用的so库文件加入到PROPMODS项中。
第三:make –j4编译项目
(完)
---------------------------
參考资料:
http://blog.csdn.net/thl789/article/details/7918093
http://www.zzqhost.com/?post=14
http://www.metsky.com/archives/635.html
----------------------------------
http://blog.csdn.net/netwalk/article/details/24737241
Android中集成第三方库的方法和问题的更多相关文章
- 详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法
详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法 一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src- ...
- json库的编译方法和vs2010中导入第三方库的方法
json库的编译方法和vs2010中导入第三方库的方法 一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/ ...
- Android中集成第三方支付
常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝An ...
- VS中引用第三方库的方法(配置sqlite数据库)
我们在编写程序时,,不可避免的会使用第三方的库文件,很少使用源文件(.cpp),大部分是使用对类进行声明的头文件和封装了类的链接库(静态lib或动态dll),比如我们写程序用的iostream这个库, ...
- Android Studio导入第三方库的三种方法
叨叨在前 今天在项目中使用一个图片选择器的第三方框架——GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. A ...
- Android Studio中导入第三方库
之前开发Android都是使用的eclipse,近期因为和外国朋友Timothy一起开发一款应用,他是从WP平台刚切换使用Android的,使用的开发环境时Android Studio,为了便于项目的 ...
- 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...
- Android.mk使用第三方库方法
/********************************************************************** * Android.mk使用第三方库方法 * 说明: * ...
- xcode中的第三方库配置问题总结
xcode中的第三方库配置总结 在导入第三方库的时候,总是会遇到许多的问题.在这里,我记录一下学到的一些知识点.写得比较乱.只要是想要记录下来,在第三方库导入的时候,遇到的一些问题. 参考网址: ht ...
随机推荐
- CentOS7 编译安装LNMP
(文章来自:http://www.cnblogs.com/i-it/p/3841840.html,请各位到这个网址去看原文的) LNMP(Linux-Nginx-Mysql-PHP),本文在CentO ...
- Socket编程实践(13) --UNIX域名协议
UNIX域名协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 差点儿是TCP的两倍(因为UNIX域套接字不须要经过网络协议栈,不须要打包/拆包,计算校验和,维护序号和 ...
- 《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon
感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- Cocos2d-x 3.0 红孩儿私人义务教育 - 第一章 熟人Cocos2d-x 3.0project
Cocos2d-x 3.0 红孩儿私家必修 前言: 时光飞逝,每每看到博客上的回复和微博上的鼓舞,总会认为亏欠大家点什么.停下来太久.总是认为不太对劲,哈哈,时习之吧,望以此勉励大家. 红孩儿C ...
- js中escape的用法----前端页面简单加密
escape() 方法,它用于转义不能用明文正确发送的任何字符.比如,电话号码中的空格将被转换成字符 %20,从而能够在 URL 中传递这些字符. http://localhost:8080/a?na ...
- tomcat 性能优化(转)
tomcat nginx默许的post大小限制 tomcat nginx默认的post大小限制执行大文件上传,或者,大数据量提交时,当提交的数据大小超过一定限制时,发现后台从request取值的代码r ...
- Spring常见问题解决办法汇总
解决The prefix 'context' for element 'context:component-scan' is not bound<beans xmlns="http:/ ...
- HDU-3502-Huson's Adventure Island(BFS+如压力DP)
Problem Description A few days ago, Tom was tired of all the PC-games, so he went back to some old F ...
- SqlServer表EXCEL数据复制的另一种方法
一个.SqlServer表中的数据复制到excel 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键.复制(也能够点击连同标题复制),拷贝到记事本中(不然会乱码) 3.然后再把记事本 ...
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...