android制作jar包:
新建android工程,然后右擊,點擊導出,選擇導出類型為Java下的JAR file,在java file specification 中不要選擇androidmanifest.xml和res文件夾,就可以了。否則在調用jar包的時候會出現“Error generating final archive: Found duplicate file for APK: AndroidManifes”這個錯誤。
如果在android用調用jar包,需要在工程的屬性的Java build path中點擊Add external JARS(也可以選擇Add Library)添加jar包,在程序中調用調用jar包中的函數即可。
添加jar包:(jar在windows下編譯了就可用了,不需要交叉編譯,這也體現了java一次編譯跨平台的特點)
也可以在Java build path中點擊Add Library添加jar包(可參考Android中引入第三方Jar包的方法,測試可行(http://www.havenliu.com/android/548.html))
在程序中調用jar包中的方法 (本文中 小寫的hello是包名,大寫的Hello類名,test是方法):
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
制作可執行的的jar包需要添加MANIFEST.MF。不需要執行的jar包,不需要MANIFEST.MF,只需要把用的class文件打包就可以了。 (jar cvf a.jar hello.class hello2.class)
制作可執行的的jar包,注意MANIFEST.MF ,M(必須大寫)ain-C(必須大寫)lass:(必須有個空格)包名.類名(必須回車),必須回車,
否則運行jar包(java -jar a.jar)時候會出現" Fail to load main-class manifest attribute from a.jar" 這個錯誤。
其他文檔:
jar包中資源問題總結(http://blog.csdn.net/yy4040/article/details/6641688)
之前提出來一個問題,參見
http://topic.csdn.net/u/20110630/14/ad71749c-631b-4fef-950d-92d5d6983628.html
分析結果如下:
1、jar被包含進其他項目后,最終生成的apk文件中包含jar中的資源(目錄結構也是一樣的),這個可以通過zip打開jar和apk查看。
2、jar中的資源應該也是被jvm管理起來的,但是由於其實際id與原始jar項目中產生 的id不一致,導致使用原始jar項目中的資源id不能訪問到實際資源。只能通過 getClass().getClassLoader().getResourceAsStream()的方式進行訪問。
對於使用jar方式進行組件開發,有以下需要注意:
1. jar包中一般只包含代碼不包含資源。
2. 如果要在jar中包含資源,則資源文件不應該放在默認的res目錄下(因為導入其他項目后可能出現重名沖突),應該在package目錄下創建專用的資源 目錄,如此通過pakcage的不重名來確保導入后資源不沖突。同時,jar中代碼不能直接使用R類中資源id進行訪問,應該通過 getClass().getClassLoader().getResourceAsStream()進行加載。
3. 字付串資源可以定義成常量的方式來使用。
Android下編譯自己的庫文件jar並在應用中調用
主要為了解決如下問題:
項目中使用了Android未公開的API,在Eclipse下會有紅叉顯示。
不同的項目抽出相同部分的代碼共用。
必需的前提條件:
需要有Android源代碼,編譯的庫文件主要是封裝未公開API或者共用代碼。
工程1:Java庫文件工程
該工程最終會生成以jar結尾的Java庫文件,並會被安裝到設備的以下目錄:
/system/framework/
另外還會安裝相關庫文件的說明文件,使系統能夠找到庫文件:
/system/etc/permissions/
1、建立工程
在Eclipse下新建一個空的Java工程。
在工程的
Java Build Path -> Libraries
下,導入Android的SDK中的 android.jar 庫。
為工程創建相應的包和java文件。
下面假設包路徑為 com.mytest.lib,最終生成的庫為 mylib.jar。
2、為工程添加注冊文件
在庫文件工程的根目錄下創建以下文件:
<permission xml file name>.xml
該文件是用來向系統注冊庫用的,名稱可以自己定,在下面假設該文件為 mylibxml.xml。
在文件中加入以下內容:
<?xml version="1.0" encoding="UTF-8"?>
<permissions>
<library
name="com.mytest.lib"
file="/system/framework/mylib.jar"
/>
</permissions>
其中的 library 用於將其下的 name 和 file 兩個屬性關聯起來,name 的值后邊會用到。
這里的 name 指定為工程的包名。
這里的 file 指定為庫文件的存放路徑,應該是:
/system/framework/<jar file name>.jar
3、為工程添加makefile文件:
在庫文件工程的根目錄下創建以下文件:
Android.mk
該文件是用來編譯工程的,名稱固定。
在文件中加入以下內容:
LOCAL_PATH:= $(call my-dir)
#MAKE_JAR
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := mylib
include $(BUILD_JAVA_LIBRARY)
#MAKE_XML
include $(CLEAR_VARS)
LOCAL_MODULE := mylibxml.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
其中,MAKE_JAR 部分的 LOCAL_MODULE 部分指定為想要生成的庫文件的名字,
需要與 .xml 文件中的 library 下的 file 部分一致。
其中,MAKE_XML 部分的 LOCAL_MODULE 部分指定為用於注冊庫的 .xml 文件。
4、生成應用程序可用的庫文件
此時的工程,如果使用了未公開的API的話,在eclipse下應該是有紅叉的。
這些錯誤不用管,只需要保證程序在Android的源碼下能夠編譯通過即可。
將工程的java文件以及 .xml 和 .mk 按照目錄結構拷貝到以下目錄:
<Android source folder>/packages/apps/<project name>/
運行以下命令:
$ cd <Android source folder>
$ . ./build/envsetup.sh
$ mmm packages/apps/<project name>
將會生成一個 .jar 文件和一個 .xml 文件。
以上兩個文件是應用程序在運行時需要用到的。
調試應用前,需要將兩個文件拷貝到設備的相應目錄上去:
.jar 文件:/system/framework/
.xml 文件:/system/etc/permissions/
拷貝到設備使用以下命令:
$ sudo adb push <.jar or .xml file path> <path in device>
拷貝完以后需要重啟設備。
5、生成在Eclipse可以引用的庫文件
在源碼下編譯的 .jar 文件在Eclipse中是不能使用的,需要單獨生成。
在Eclipse下選中工程根目錄,選擇文件菜單中的導出Export,然后選擇jar類型。
導出為jar文件時,只需要選中相應的java文件即可。
這樣生成的jar文件僅僅供應用程序在Eclipse下使用,除非是以下情況:
庫文件沒有使用非公開的API,並且,
應用本身在Eclipse下編譯就能夠使用,不需要到源碼下編譯。
暫且為該文件命名為mylibtemp.jar
工程2:Android應用工程
1、建立工程
新建一個Android工程。
在工程的
Java Build Path -> Libraries
下,導入 mylibtemp.jar 庫。
使用 mylibtemp.jar 中的類編寫代碼。
下面假設最后生成的應用程序文件為 myapp.apk。
2、編輯AndroidManifest.xml文件
編輯工程根目錄下的 AndroidManifest.xml 文件。
在 application 下添加以下內容:
<uses-library
android:name="com.mytest.lib">
</uses-library>
其中的 :name 表示所引用的庫文件的包名。
其與庫工程的 .xml 文件中的 name 應該是一致的。
這樣在應用運行時就能夠找到相應的 .jar 文件了。
如果引用了多個庫,需要添加多個 uses-library 標簽。
3、為工程添加makefile文件:
在庫文件工程的根目錄下創建以下文件:
Android.mk
該文件是用來編譯工程的,名稱固定。
在文件中加入以下內容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := mylib
LOCAL_PACKAGE_NAME := myapp
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
其中的 LOCAL_JAVA_LIBRARIES 表示程序會用到的庫文件。
其名成與庫工程下的 .mk 文件中 MAKE_JAR 部分下的 LOCAL_MODULE 應該是一致的。
其中的 LOCAL_PACKAGE_NAME 表示應用最后生成的名稱。
4、編譯應用程序
將工程的 src、res、assets 文件夾以及文件:
Android.mk 和 AndroidManifest.xml
按照目錄結構拷貝到以下目錄:
<Android source folder>/packages/apps/<project name>/
引用的 .jar 庫文件並不需要。
運行以下命令:
$ cd <Android source folder>
$ . ./build/envsetup.sh
$ mmm packages/apps/<project name>
將會生成一個 .apk 文件。
運行以下命令將應用安裝到設備:
$ sudo adb install [-r] <apk file path>
以下為制作可執行jar包方法:
轉自:http://blog.chinaunix.net/uid-20640731-id-60041.html
public class Hello {
public static void main(String args[]){
System.out.println("Hello World!");
}
}
標明清單(manifest)
增加:hello/(讀入= 0) (寫出= 0)(存儲了 0%)
增加:hello/Hello.class(讀入= 422) (寫出= 289)(壓縮了 31%)
增加:hello/Hello.java(讀入= 136) (寫出= 108)(壓縮了 20%)
Hello World!
按照下文http://blog.chinaunix.net/uid-20640731-id-60041.html測試了,成功。
制作可執行的的jar包需要添加MANIFEST.MF。不需要執行的jar包,不需要MANIFEST.MF,只需要把用的class文件打包就可以了。 (jar cvf a.jar hello.class hello2.class)
制作可執行的的jar包,注意MANIFEST.MF ,M(必須大寫)ain-C(必須大寫)lass:(必須有個空格)包名.類名(必須回車),必須回車,
否則運行jar包(java -jar a.jar)時候會出現" Fail to load main-class manifest attribute from a.jar" 這個錯誤。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
制作可執行的的jar包需要添加MANIFEST.MF。不需要執行的jar包,不需要MANIFEST.MF,只需要把用的class文件打包就可以了。 (jar cvf a.jar hello.class hello2.class)
制作可執行的的jar包,注意MANIFEST.MF ,M(必須大寫)ain-C(必須大寫)lass:(必須有個空格)包名.類名(必須回車),必須回車,
否則運行jar包(java -jar a.jar)時候會出現" Fail to load main-class manifest attribute from a.jar" 這個錯誤。
---------------------------------------------------------------------------------------------------------