【求教】Android.mk编译apk,第三方的jar包编译不进去!

时间:2022-09-14 09:18:03
本人开发一个apk,用到了一个第三方的jar包,用eclipse adt插件编译一切正常,
编译出来的apk里可以看到已经把第三方的jar的东西包进来了。

诡异的是,本人需要用android源码环境编译,jar放在lib下。
Android.mk如下(一切都是那么合理。。。)

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := foo
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := MyApp
include $(BUILD_PACKAGE)

##################################################  
include $(CLEAR_VARS)  
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:lib/third.jar 
include $(BUILD_MULTI_PREBUILT)  

mm 编译方式并不报错,但是编译出来的apk就是没有jar的东东,
apk装完运行自然达不到原来的效果。

郁闷死了,看了其他例子都是这么做的,百思不得其解,求大神指教!

30 个解决方案

#1


正所谓小鲁怡情,大鲁伤身,樯橹灰飞烟灭,下联就是什么百撕不得...

#2


LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:lib/third.jar 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo: third.jar 
试一下

#3


这个不是原因,只不过你说的把jar放在代码根目录下了,一样的效果的,不过还是谢谢你!

引用 2 楼 franzhong 的回复:
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:lib/third.jar 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:third.jar 
试一下

#4


jar与你的源码环境有没有冲突,比如你的jar的功能、定义等源码中已经有啦

#5


是怪了。。。

你把LOCAL_MODULE_TAGS := optional加上试试。
把foo改成libfoo试试(照理没区别)
确定jar包在lib下面,不是libs吗?

只能瞎猜了。。。

#6


比较下adt插件环境与源码环境

#7


1. 你的 第三方库应该新建一个工程目录, 例如 thirds
2. thirds 应该就是你的第三方库prebuilt工程配置, Android.mk 怎么写你应该清楚
2. apk  的 Android.mk 脚本中除了你写的那些, 有没有加上如下一行:

include $(callall-makefiles-under,$(LOCAL_PATH))

这样才能保证能找到你第三方库位置, 从而copy

#8


源码编译不会把jar文件打进APK压缩包,所以你要在mk文件中把jar文件复制到系统的lib目录中,并且还要build配置把该jar编入系统才可。

#9


好像系统的lib下只有so类型的库,jar库不会放在里边吧。。
求教。

引用 8 楼 androidchuxueze 的回复:
源码编译不会把jar文件打进APK压缩包,所以你要在mk文件中把jar文件复制到系统的lib目录中,并且还要build配置把该jar编入系统才可。

#10



谢谢,不过你这种做法其实和我的是一样的,只不过由加了一级目录而已,
试过了没用的
引用 7 楼 looooooooop 的回复:
1. 你的 第三方库应该新建一个工程目录, 例如 thirds
2. thirds 应该就是你的第三方库prebuilt工程配置, Android.mk 怎么写你应该清楚
2. apk  的 Android.mk 脚本中除了你写的那些, 有没有加上如下一行:

include $(callall-makefiles-under,$(LOCAL_PATH))

……

#11


引用 9 楼 Megaderma 的回复:
好像系统的lib下只有so类型的库,jar库不会放在里边吧。。
求教。

引用 8 楼 androidchuxueze 的回复:源码编译不会把jar文件打进APK压缩包,所以你要在mk文件中把jar文件复制到系统的lib目录中,并且还要build配置把该jar编入系统才可。


这个。。,看错了,把jar文件copy到系统framework目录下。

#12


好像是不会有 jar 文件, 应该是都被android处理过了, 转换成 dalvik 识别的字节码;
apk 的所有java代码最终都 集中到 classes.dex 这个文件

#13


这位仁兄说的对。
我仔细研究了一下。
编译apk的流程是这样的,先把资源res打包进去,
然后把java 代码用java正常编译工具编译成class文件组成的jar文件,
最后再用androi的特有的dx工具把classes.jar变成dex.
最后apk里就有res和dex组成。

由上,如果我们要用第三方的jar包(一般是由class文件构成的,我这个jar包里关键是还有res),源码的make好像默认支持不了啊。

引用 12 楼 looooooooop 的回复:
好像是不会有 jar 文件, 应该是都被android处理过了, 转换成 dalvik 识别的字节码;
apk 的所有java代码最终都 集中到 classes.dex 这个文件

#14


对于包含资源文件的 jar, 请参考:
http://blog.csdn.net/arui319/article/details/8123396

http://tech.it168.com/a2012/0406/1334/000001334145.shtml




引用 13 楼 Megaderma 的回复:
这位仁兄说的对。
我仔细研究了一下。
编译apk的流程是这样的,先把资源res打包进去,
然后把java 代码用java正常编译工具编译成class文件组成的jar文件,
最后再用androi的特有的dx工具把classes.jar变成dex.
最后apk里就有res和dex组成。

由上,如果我们要用第三方的jar包(一般是由class文件构成的,我这个j……

#15


你这两篇讲的是adt如何使用jar的,和我的主题如何用make使用无关 呵呵,谢谢!
引用 14 楼 looooooooop 的回复:
对于包含资源文件的 jar, 请参考:
http://blog.csdn.net/arui319/article/details/8123396

http://tech.it168.com/a2012/0406/1334/000001334145.shtml

#16


你就不能变通下? 
最终编译不还是靠android提供的那些工具?
资源引用的机制还能脱离android?
需要的工程你不能不用adt创建?

引用 15 楼 Megaderma 的回复:
你这两篇讲的是adt如何使用jar的,和我的主题如何用make使用无关 呵呵,谢谢!
引用 14 楼 looooooooop 的回复:对于包含资源文件的 jar, 请参考:
http://blog.csdn.net/arui319/article/details/8123396

http://tech.it168.com/a2012/0406/1334/0000……

#17


变通谁不会,用adt早就搞定了啊。
现在就是要用make。
继续等高人解答。
引用 16 楼 looooooooop 的回复:
你就不能变通下? 
最终编译不还是靠android提供的那些工具?
资源引用的机制还能脱离android?
需要的工程你不能不用adt创建?

引用 15 楼 Megaderma 的回复:你这两篇讲的是adt如何使用jar的,和我的主题如何用make使用无关 呵呵,谢谢!
引用 14 楼 looooooooop 的回复:对于包含资源文件的 jar, 请参考:
……

#18


我说的变通不是让你去用 ADT,   是指借用ADT的处理方式
算了, 等吧

#19


我看了一路的讨论,我之前编译的都是只编译自己写的工程文件,我还真没有加载过别人jar包!

#20


引用 4 楼 jialiry 的回复:
jar与你的源码环境有没有冲突,比如你的jar的功能、定义等源码中已经有啦


如果jar与源码有冲突,请问如何解决??

#21


是不是因为你虽然Android.mk文件中加了这个jar包,但代码里面并没有使用jar包里面的内容,被android编译的时候优化删掉了,遇到过这种情况,只要代码里用到就能在最后的apk中找到了

#22


我是这样写的mk文件,可以编译过的,你试下:



LOCAL_STATIC_JAVA_LIBRARIES := android-common com.android.emailcommon com.android.emailsync guava android-common-chips libphotoviewer
#LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += mylib #这个是我自己加的jar包名字,名字任意写

...

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)   
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := mylib:libs/android-support-v4.jar  #我要编译的jar包存放位置
include $(BUILD_MULTI_PREBUILT)

#23


求解 球高人 谢谢

#24


1、初步判断不是第三方jar的问题,一般来说jar没打包进去程序会运行报错
   这个可以反编译apk确定是否有打包进去

2、达不到原来的效果,这个应该指的是UI上的效果吧
   eclipse和源码编译是有不同的,尤其有些UI上样式是不一样的

#25


我也碰到同样的问题,要如何解决,能否共享下

#26


LOCAL_PROGUARD_ENABLED := disabled

#27


我的这个方法是经过验证的:LOCAL_PROGUARD_ENABLED := disabled ,肯定是这个原因

#28


你看能不能把这个jar单独编译成dex,,拷贝到一个目录,将这个路径加到系统CLASSPATH环境变量中,这样apk应该能调用到

#29


解没解决?楼主

#30


给你的jar包配置一个make文件 。在你的apk里面写入LOCAL_REQUIRED_MODULES :=XXX.jar 即可。

#1


正所谓小鲁怡情,大鲁伤身,樯橹灰飞烟灭,下联就是什么百撕不得...

#2


LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:lib/third.jar 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo: third.jar 
试一下

#3


这个不是原因,只不过你说的把jar放在代码根目录下了,一样的效果的,不过还是谢谢你!

引用 2 楼 franzhong 的回复:
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:lib/third.jar 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := foo:third.jar 
试一下

#4


jar与你的源码环境有没有冲突,比如你的jar的功能、定义等源码中已经有啦

#5


是怪了。。。

你把LOCAL_MODULE_TAGS := optional加上试试。
把foo改成libfoo试试(照理没区别)
确定jar包在lib下面,不是libs吗?

只能瞎猜了。。。

#6


比较下adt插件环境与源码环境

#7


1. 你的 第三方库应该新建一个工程目录, 例如 thirds
2. thirds 应该就是你的第三方库prebuilt工程配置, Android.mk 怎么写你应该清楚
2. apk  的 Android.mk 脚本中除了你写的那些, 有没有加上如下一行:

include $(callall-makefiles-under,$(LOCAL_PATH))

这样才能保证能找到你第三方库位置, 从而copy

#8


源码编译不会把jar文件打进APK压缩包,所以你要在mk文件中把jar文件复制到系统的lib目录中,并且还要build配置把该jar编入系统才可。

#9


好像系统的lib下只有so类型的库,jar库不会放在里边吧。。
求教。

引用 8 楼 androidchuxueze 的回复:
源码编译不会把jar文件打进APK压缩包,所以你要在mk文件中把jar文件复制到系统的lib目录中,并且还要build配置把该jar编入系统才可。

#10



谢谢,不过你这种做法其实和我的是一样的,只不过由加了一级目录而已,
试过了没用的
引用 7 楼 looooooooop 的回复:
1. 你的 第三方库应该新建一个工程目录, 例如 thirds
2. thirds 应该就是你的第三方库prebuilt工程配置, Android.mk 怎么写你应该清楚
2. apk  的 Android.mk 脚本中除了你写的那些, 有没有加上如下一行:

include $(callall-makefiles-under,$(LOCAL_PATH))

……

#11


引用 9 楼 Megaderma 的回复:
好像系统的lib下只有so类型的库,jar库不会放在里边吧。。
求教。

引用 8 楼 androidchuxueze 的回复:源码编译不会把jar文件打进APK压缩包,所以你要在mk文件中把jar文件复制到系统的lib目录中,并且还要build配置把该jar编入系统才可。


这个。。,看错了,把jar文件copy到系统framework目录下。

#12


好像是不会有 jar 文件, 应该是都被android处理过了, 转换成 dalvik 识别的字节码;
apk 的所有java代码最终都 集中到 classes.dex 这个文件

#13


这位仁兄说的对。
我仔细研究了一下。
编译apk的流程是这样的,先把资源res打包进去,
然后把java 代码用java正常编译工具编译成class文件组成的jar文件,
最后再用androi的特有的dx工具把classes.jar变成dex.
最后apk里就有res和dex组成。

由上,如果我们要用第三方的jar包(一般是由class文件构成的,我这个jar包里关键是还有res),源码的make好像默认支持不了啊。

引用 12 楼 looooooooop 的回复:
好像是不会有 jar 文件, 应该是都被android处理过了, 转换成 dalvik 识别的字节码;
apk 的所有java代码最终都 集中到 classes.dex 这个文件

#14


对于包含资源文件的 jar, 请参考:
http://blog.csdn.net/arui319/article/details/8123396

http://tech.it168.com/a2012/0406/1334/000001334145.shtml




引用 13 楼 Megaderma 的回复:
这位仁兄说的对。
我仔细研究了一下。
编译apk的流程是这样的,先把资源res打包进去,
然后把java 代码用java正常编译工具编译成class文件组成的jar文件,
最后再用androi的特有的dx工具把classes.jar变成dex.
最后apk里就有res和dex组成。

由上,如果我们要用第三方的jar包(一般是由class文件构成的,我这个j……

#15


你这两篇讲的是adt如何使用jar的,和我的主题如何用make使用无关 呵呵,谢谢!
引用 14 楼 looooooooop 的回复:
对于包含资源文件的 jar, 请参考:
http://blog.csdn.net/arui319/article/details/8123396

http://tech.it168.com/a2012/0406/1334/000001334145.shtml

#16


你就不能变通下? 
最终编译不还是靠android提供的那些工具?
资源引用的机制还能脱离android?
需要的工程你不能不用adt创建?

引用 15 楼 Megaderma 的回复:
你这两篇讲的是adt如何使用jar的,和我的主题如何用make使用无关 呵呵,谢谢!
引用 14 楼 looooooooop 的回复:对于包含资源文件的 jar, 请参考:
http://blog.csdn.net/arui319/article/details/8123396

http://tech.it168.com/a2012/0406/1334/0000……

#17


变通谁不会,用adt早就搞定了啊。
现在就是要用make。
继续等高人解答。
引用 16 楼 looooooooop 的回复:
你就不能变通下? 
最终编译不还是靠android提供的那些工具?
资源引用的机制还能脱离android?
需要的工程你不能不用adt创建?

引用 15 楼 Megaderma 的回复:你这两篇讲的是adt如何使用jar的,和我的主题如何用make使用无关 呵呵,谢谢!
引用 14 楼 looooooooop 的回复:对于包含资源文件的 jar, 请参考:
……

#18


我说的变通不是让你去用 ADT,   是指借用ADT的处理方式
算了, 等吧

#19


我看了一路的讨论,我之前编译的都是只编译自己写的工程文件,我还真没有加载过别人jar包!

#20


引用 4 楼 jialiry 的回复:
jar与你的源码环境有没有冲突,比如你的jar的功能、定义等源码中已经有啦


如果jar与源码有冲突,请问如何解决??

#21


是不是因为你虽然Android.mk文件中加了这个jar包,但代码里面并没有使用jar包里面的内容,被android编译的时候优化删掉了,遇到过这种情况,只要代码里用到就能在最后的apk中找到了

#22


我是这样写的mk文件,可以编译过的,你试下:



LOCAL_STATIC_JAVA_LIBRARIES := android-common com.android.emailcommon com.android.emailsync guava android-common-chips libphotoviewer
#LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += mylib #这个是我自己加的jar包名字,名字任意写

...

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)   
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := mylib:libs/android-support-v4.jar  #我要编译的jar包存放位置
include $(BUILD_MULTI_PREBUILT)

#23


求解 球高人 谢谢

#24


1、初步判断不是第三方jar的问题,一般来说jar没打包进去程序会运行报错
   这个可以反编译apk确定是否有打包进去

2、达不到原来的效果,这个应该指的是UI上的效果吧
   eclipse和源码编译是有不同的,尤其有些UI上样式是不一样的

#25


我也碰到同样的问题,要如何解决,能否共享下

#26


LOCAL_PROGUARD_ENABLED := disabled

#27


我的这个方法是经过验证的:LOCAL_PROGUARD_ENABLED := disabled ,肯定是这个原因

#28


你看能不能把这个jar单独编译成dex,,拷贝到一个目录,将这个路径加到系统CLASSPATH环境变量中,这样apk应该能调用到

#29


解没解决?楼主

#30


给你的jar包配置一个make文件 。在你的apk里面写入LOCAL_REQUIRED_MODULES :=XXX.jar 即可。