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出现故障的点及解决的方法


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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、 在应用tests目录文件下新建一个libs文件夹,将android-junit-report-dev.jar拷贝到该libs文件夹 2、 在应用tests目录Android.mk文件加上如下配置: LOCAL_STATIC_JAVA_LIBRARIES += android-junit-report-dev-FM2tests include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-junit-report-dev-FM2tests:libs/android-junit-report-dev.jar include $(BUILD_MULTI_PREBUILT) 其红色的android-junit-report-dev-FM2tests的文件命名必须保持一致, 如果应该tests目录下的Android.mk文件有LOCAL_SDK_VERSION := current这个配置,需要将该配置修改为LOCAL_PRIVATE_PLATFORM_APIS := true 3、 将应用tests目录下的AndroidManifest.xml文件的 instrumentation android:name="android.test.InstrumentationTestRunner" 修改为 instrumentation android:name="com.zutubi.android.junitreport.JUnitReportTestRunner" 4、 在sonar-project.properties文件最后加上如下语句: sonar.junit.reportPaths=. 5、 将编译生成的应用apk和tests的apk安装到手机板卡(编译应用apk的时候需要加上参数PRODUCT_HAS_TESTS=1用于计算覆盖率) 6、 执行命令:adb shell am instrument -e coverage true -w com.caf.fmradio.tests/com.zutubi.android.junitreport.JUnitReportTestRunner 其,com.zutubi.android.junitreport.JUnitReportTestRunner与第3步更改的name名称一致 7、 将执行结果后生成的文件拷贝到应用代码的代码的根目录下 生成的文件路径在手机的/data/user/0/com.caf.fmradio/files目录下,该目录下包含两个文件coverage.ec 和 junit-report.xml。 8、 将junit-report.xml重命名为“TEST-”开头的文件,如TEST-junit-report.xml 9、 执行ant -f build.xml命令得到覆盖率的结果(build.xml文件可参考覆盖率文档) 10、在应用代码根目录下(与sonar-project.properties同目录下)执行sonar-scanner命令,则可以在sonar网站得到相关代码的覆盖率和单元测试数。
酷开系统是一种基于Android系统的智能电视系统,可以享受高质量的音视频和图像效果。酷开系统的应用商店提供了一些基本应用程序,但有些用户需要更多的功能,而第三方ROM可以带来更多的特性和自定义界面。刷第三方ROM并不是一件容易的事情,需要用户有一定的电脑技术和恢复能力。以下是酷开系统刷第三方ROM的步骤。 第一步是准备工作,用户必须确保电视上有足够的空间来安装第三方ROM,同时需要下载第三方ROM的镜像文件并保存在电脑。同时也需要USB设备,有助于传输文件。 第二步是进入集成电视机电源开关开关机长按键,然后用遥控器开机将其连接至网络,如果使用WI-FI则需要输入密码。由此我们可进入酷开界面. 第三步是打开USB调试设置。在设置菜单选择“开发者选项”,然后打开“USB调试”设置。这个选项非常重要,因为如果没有打开该选项,电视机将无法识别电脑通过USB传输的文件。 第四步是准备好电脑。您将需要一个Xbox360游戏手柄和一个PC拖线来进行下一步操作。此外,您还需要下载和安装ADB和Fastboot工具。连接一侧插入电视机,另一侧连接至电脑电源。 第五步是进入FastBoot模式。按下电视机上的音量减键和电源键,直到我们看到一张草图。这就是第三方ROM的安装准备阶段。 第六步是将ROM传输到电视机上。将ROM文件复制到电视机的内部存储器,并记下该文件所在的位置。通过电脑运行ADB命令,手动将ROM文件推送到电视机上安装。如果一切顺利,ROM将在电视机上成功安装。 总的来说,酷开系统刷第三方ROM是一个复杂的过程,需要一定的技术和恢复能力。但是,第三方ROM可以为用户带来更多的特性和个性化的界面,所以如果您希望拥有更多的控制权和自定义功能,这个过程可能值得一试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值