编译带有第三方jar包的ap,如何才能过用mmm编译成功(update 20100728)

++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE

时隔很久了,因为项目中一直认为这个是个瓶颈,导致本来可以放在一个AP里面的东西要写成两个AP,所以我又回来看了这个问题,这次我想到了在android源码中是不是有AP用过jar包,那我学习它不就好了?

所以我在Ubuntu下搜索package/app目录: find -name '*.jar'

结果发现Calculator就有用到jar包,我真是蠢,以前都不晓得怎么想的,会去绕那么一大圈,人家calculator不是写好了例子啊,其实很简单就是MK文件的问题,最后我模拟Calculator写了一个例子就成功了,总共耗费不到半小时就搞完了。具体代码如下:

 

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_STATIC_JAVA_LIBRARIES := libarity LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := TestJar include $(BUILD_PACKAGE) ################################################## include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:lily.jar include $(BUILD_MULTI_PREBUILT) # Use the folloing include to make our test apk. include $(call all-makefiles-under,$(LOCAL_PATH)) 

 

关键在于LOCAL_STATIC_JAVA_LIBRARIES := libarity和LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:lily.jar

其实libarity是个名字可以随便取,但是两个属性的值要一样就好了,但是后面那个冒号里面就一定要写你的jar包名,你的jar包一定放在工程的根目录就好了,目录结构如下:

-res

-src

-com

-ianc

-testjar

TestJar.java

android.mk

AndroidManifest.xml

default.properties

lily.jar

 

我贴不了图,这样应该能明白吧

 

最后再贴上代码吧

 

JAR包的代码:

Lily.java

package com.ianc.jar; public class Lily { String name; public void setName(String name) { this.name = name; } public Lily() { super(); } public Lily(String name) { super(); this.name = name; } public String getName(){ return "lily"; } }  

用Eclipse-->export-->选中JAVA里面的JAR file这项,然后一路next就可以生成JAR包

 

测试工程的简单代码(TestJar.java):

package com.ianc.testjar; import android.app.Activity; import android.os.Bundle; import com.ianc.jar.Lily; public class TestJar extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Lily l = new Lily("lily"); String result = l.getName(); this.setTitle(result); } } 

 

整个工程我已经upload:http://d.download.csdn.net/down/2579599/xijiaohuangcao(不要资源分,随便下)

 

++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE

 

 

 

以下内容是旧的,请无视

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

 

 

 

我们的ap是拿android自带的ap改的,由于引用了sdk中找不到的一些类,所以要生成apk,必须下mmm命令,而无法通过Eclipse自动生成。

可是我们却需要为这个ap添加一个自己写的jar包,我查阅很多资料都只有介绍如何用Eclipse实现这样的功能,可是却不适合我们的ap,于是我开始实验。

我想到了模仿系统ap,因为系统ap肯定也是有需要jar包,所以我用Google代码搜索,看到在mk文件中有这样的语句:

 

LOCAL_JAVA_LIBRARIES := core ext
很显然,core和ext是在system/framework下的两个jar包,很多ap都有用到,于是我就试着将我的mk文件修改后,添加了类似上面的这条
语句,我以为我就大功告成了,可是下mmm命令后却得到一个报错的信息:

No rule to make target 'out/target/common/obj/JAVA_LIBRARIES/home/helen/myandroid/package/apps/Settings_UI/libs/BookStore.jar_intermediates/javalib.jar',needed by 'out/target/common/obj/APPS/Setting_intermediates/classes-full-debug.jar'. Stop

任凭我怎么都没办法,后来我就去out/target/common/obj/JAVA_LIBRARIES/这个目录参观了一下,我发现这里面有许多和system/framework

下的jar包对应的文件夹,于是我打开看,每个文件夹里面包含的文件名字都是一样的,从左到右的文件依次是:

emma_out classes.dex classes.jar classes-full-debug.jar javalib.jar,这些正好和我报错的内容不谋而合,于是我去追溯这个文件夹是

如何生成的,拿test-runner打比方,我发现这个其实是由frameworks/base/test-runner下的东西生成的,而这个其实就是jar包的源代码,

我恍然大悟,仅仅拿jar文件其实是没法编成功的,必须拿到jar的源代码,然后仿造test-runner下的mk文件,将里面的

LOCAL_MODULE:= android.test.runner

改换成自己想要的jar包名字就可以了,所以需要先将jar包的源码,放在frameworks/base/lily,再用mmm编译一次,执行如下:

root@lily-laptop:~/android1.5# . build/envsetup.sh root@lily-laptop:~/android1.5# mmm frameworks/base/lily/ make: Entering directory `/home/lily/android1.5' build/core/product_config.mk:261: WARNING: adding test OTA key ============================================ TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID= ============================================ target Java: android.test.lily (out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes) Copying out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes-full-debug.jar Copying: out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/classes.jar target Dex: android.test.lily target Jar: android.test.lily (out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediates/javalib.jar) Install: out/target/product/generic/system/framework/android.test.lily.jar

可以看到,他有生成我们所期待的classes-full-debug.jar,classes.jar,javalib.jar,android.test.lily.jar统统都出来啦,哈哈!(这里android.test.lily.jar是我要引用的jar包)

这次我再去我的ap下将mk文件添加:
LOCAL_JAVA_LIBRARIES := android.test.runner android.test.lily(android.test.runner是原本的,我就没删掉了)
于是再一次鼓起勇气执行“mmm 我的ap路径",我滴神呐,终于过了,哈哈!
执行结果如下:
root@lily-laptop:~/android1.5# . build/envsetup.sh root@lily-laptop:~/android1.5# mmm packages/apps/ImportSD/ make: Entering directory `/home/lily/android1.5' build/core/product_config.mk:261: WARNING: adding test OTA key ============================================ TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID= ============================================ target Java: ImportSD (out/target/common/obj/APPS/ImportSD_intermediates/classes) Copying out/target/common/obj/APPS/ImportSD_intermediates/classes-full-debug.jar Copying: out/target/common/obj/APPS/ImportSD_intermediates/classes.jar target Dex: ImportSD target Package: ImportSD (out/target/product/generic/obj/APPS/ImportSD_intermediates/package.apk) Install: out/target/product/generic/system/app/ImportSD.apk
所以必须是先将jar的源码make一次,再按照正常的方式修改ap的mk文件就ok了。可是你要问我你要不是自己写的jar,那这个就。。。不知道了,
除非你能拿到以上的out/target/common/obj/JAVA_LIBRARIES/android.test.lily_intermediate这个文件夹下的所有东西,
以及out/target/product/generic/system/framework/android.test.lily.jar并且按照相同的路径建立起来,也就是人为的制造出
按照make jar源码会生成出来的所有东西,如果能拿到,这样我想应该也是可以的。
我之前一直认为我将编译好的jar放入system/framework,再在mk中引用就完全可以的,并且苦苦在网上找寻都无果啊,结果看到一个老外问他
的jar包make为什么过不了,才悟过来原来android是有另外的机制的,整个的jar拿来没法直接用,必须重新make一次,虽然我还没明白为啥一定要这么做,不过总算探明白了如何添加第三方jar
包并能通过mmm啦!好高兴耶!
本人才疏学浅,如果你有更好的方法,还请各位不吝赐教!

 

你可能感兴趣的:(android,jar,2010,build,java,string,eclipse)