++++++++++++++++++UPDATE++++++++++++++++++UPDATE+++++++++++++++++++++UPDATE+++++++++++++++++++++++++++++++++++++UPDATE
时隔很久了,因为项目中一直认为这个是个瓶颈,导致本来可以放在一个AP里面的东西要写成两个AP,所以我又回来看了这个问题,这次我想到了在android源码中是不是有AP用过jar包,那我学习它不就好了?
所以我在Ubuntu下搜索package/app目录: find -name '*.jar'
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包)