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.当前工程scanerapp下创建libs目录

B.使用Eclipse导入scanerjar.jar包即可

2、libscanerbase.so和libscanerplus.so集成

A.当前工程scanerapp下创建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平台上使用,其它平台可能不同。

三、容易出现问题的点及解决办法

1.  集成库文件到Eclipse项目

在将库文件添加到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中集成第三方库的方法和问题,码迷,mamicode.com

时间: 2024-09-30 07:03:47

Android中集成第三方库的方法和问题的相关文章

Android中集成第三方支付

常见的第三方支付解决方案 支付宝支付 微信支付 银联支付 Ping++统一支付平台(需要继承服务器端和客户端) 短信支付 支付宝的集成流程 相关资料链接: 支付宝支付指引流程:支付指引流程 支付宝Android端集成流程:Android端集成流程 首先,支付宝支付准备工作 首先登录[支付宝开放平台]http://open.alipay.com/platform/home.htm,创建应用,并给应用添加App支付功能 由于App支付功能需要签约,因此需要上传公司信息和证件等资料进行签约 签约成功后

android studio 导入第三方库的方法

今天在导入第三方库的时候发生了一系列的错误,记录一下经验吧. 1.现将第三方*.jar或 *.aar包放到项目中的/app/libs 目录下.然后修改项目的 2.修改project 的build.gradle在 allprojects =>repositories 中添加如下,来设置导入目录 /***Adds an configures a repository which will look for dependencies in a number of local directories.*

json库的编译方法和vs2010中导入第三方库的方法

一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/    版本为v0.5.0 最新版本在:https://github.com/open-source-parsers/jsoncpp 二.编译链接成库文件 1)解压下载的json包,得到jsoncpp-src-0.5.0文件,打开jsoncpp-src-0.5.0\makefiles\vs71\jsoncpp.sln 2)转换项目为vs2010格式,并将模

详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法

一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src-0.5.0 -> makefiles -> vs71 -> jsoncpp.sln 4 转换项目为VS2010格式 5 选择debug模式 6 在“解决方案资源管理器”中右击 lib_json 选择->仅用于项目 -> 仅生成lib_json 7 再次右击 lib_json 选择->仅用于项目 -> 仅链接lib_json 8 选择r

Android Studio中导入第三方库

之前开发Android都是使用的eclipse,最近由于和外国朋友Timothy一起开发一款应用,他是从WP平台刚切换使用Android的,使用的开发环境时Android Studio,为了便于项目的交流,我便尝试着去使用Android Studio.刚开始用遇到一个问题:如何在Android Studio中导入第三方库? 首先本人使用的Studio版本为0.5.8,尝试解决方法如下,分两种: 1.导入jar包 直接复制你的jar包(如actiobarsherlock.jar)至工程的libs目

【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添加进工作的build path.3.(关键的一步)将lib设为源文件夹.如果不设置,则程序编译可以通过,但运行的时候,会报: java.lang.NoClassDefFoundError # re: Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundErro

小程序云开发调用HTTP请求中got第三方库使用失败解决方法

小程序云开发调用HTTP请求中got第三方库使用失败解决方法 错误代码 {"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"The \"original\" argument must be of type function"} 替换方案 // 云函数入口文件 const cloud = req

Android中启动第三方应用

主要是通过包名启动第三方应用,获取去包名的方法网上很多,就不多说了. 两种方式启动: 第一种: Intent intent = new Intent(); intent.setClassName("要启动应用的包名", "要启动应用的activity"); startActivity(intent); 第二种: Intent intent = new Intent(); intent = MainActivity.this.getPackageManager().g

复制工程或修改工程名字后找不到第三方库解决方法

问题: couldn't found -lwexin 等与第三方库有关的关键词报错,如上图. 解决方法:在工程文件中删掉第三方库的引用,然后再重新添加进来.command+B,OK. 复制工程或修改工程名字后找不到第三方库解决方法