[安卓問題]如何製做Jar包並在android中調用jar包

ndroid製做jar包:html

新建android工程,而後右擊,點擊導出,選擇導出類型爲Java下的JAR file,在java file specification 中不要選擇androidmanifest.xml和res文件夾,就能夠了。不然在調用jar包的時候會出現「Error generating final archive: Found duplicate file for APK: AndroidManifes」這個錯誤。java


若是在android用調用jar包,須要在工程的屬性的Java build path中點擊Add external JARS(也能夠選擇Add Library)添加jar包,在程序中調用調用jar包中的函數便可。android

添加jar包:(jar在windows下編譯了就可用了,不須要交叉編譯,這也體現了java一次編譯跨平臺的特色windows

也能夠在Java build path中點擊Add Library添加jar包(可參考Android中引入第三方Jar包的方法,測試可行(http://www.havenliu.com/android/548.html))app



在程序中調用jar包中的方法 (本文中 小寫的hello是包名,大寫的Hello類名,test是方法):eclipse






-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------jvm




製做可執行的的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" 這個錯誤。ui

-----------------------------------------------------------------------------------------------------------------------------------



其餘文檔:

jar包中資源問題總結(http://blog.csdn.net/yy4040/article/details/6641688)

以前提出來一個問題,參見

http://topic.csdn.net/u/20110630/14/ad71749c-631b-4fef-950d-92d5d6983628.html

分析結果以下:

一、jar被包含進其餘項目後,最終生成的apk文件中包含jar中的資源(目錄結構也是同樣的),這個能夠經過zip打開jar和apk查看。

二、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並在應用中調用

(轉自http://hi.baidu.com/gaogaf/item/cef2285e2372bb444fff2046)

主要爲了解決以下問題:
項目中使用了Android未公開的API,在Eclipse下會有紅叉顯示。
不一樣的項目抽出相同部分的代碼共用。

必需的前提條件:
須要有Android源代碼,編譯的庫文件主要是封裝未公開API或者共用代碼。


工程1:Java庫文件工程

該工程最終會生成以jar結尾的Java庫文件,並會被安裝到設備的如下目錄:
/system/framework/
另外還會安裝相關庫文件的說明文件,使系統可以找到庫文件:
/system/etc/permissions/

一、創建工程
在Eclipse下新建一個空的Java工程。
在工程的 
Java Build Path -> Libraries
下,導入Android的SDK中的 android.jar 庫。
爲工程建立相應的包和java文件。
下面假設包路徑爲 com.mytest.lib,最終生成的庫爲 mylib.jar。

二、爲工程添加註冊文件
在庫文件工程的根目錄下建立如下文件:
<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

三、爲工程添加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 文件。

四、生成應用程序可用的庫文件
此時的工程,若是使用了未公開的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>
拷貝完之後須要重啓設備。

五、生成在Eclipse能夠引用的庫文件
在源碼下編譯的 .jar 文件在Eclipse中是不能使用的,須要單獨生成。
在Eclipse下選中工程根目錄,選擇文件菜單中的導出Export,而後選擇jar類型。
導出爲jar文件時,只須要選中相應的java文件便可。
這樣生成的jar文件僅僅供應用程序在Eclipse下使用,除非是如下狀況:
庫文件沒有使用非公開的API,而且,
應用自己在Eclipse下編譯就可以使用,不須要到源碼下編譯。
暫且爲該文件命名爲mylibtemp.jar


工程2:Android應用工程

一、創建工程
新建一個Android工程。
在工程的 
Java Build Path -> Libraries
下,導入 mylibtemp.jar 庫。
使用 mylibtemp.jar 中的類編寫代碼。
下面假設最後生成的應用程序文件爲 myapp.apk。

二、編輯AndroidManifest.xml文件
編輯工程根目錄下的 AndroidManifest.xml 文件。
在 application 下添加如下內容:
<uses-library
android:name="com.mytest.lib">
</uses-library>
其中的 :name 表示所引用的庫文件的包名。
其與庫工程的 .xml 文件中的 name 應該是一致的。
這樣在應用運行時就可以找到相應的 .jar 文件了。
若是引用了多個庫,須要添加多個 uses-library 標籤。

三、爲工程添加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 表示應用最後生成的名稱。

四、編譯應用程序
將工程的 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

今天試了一下製做可執行的Jar文件的方法。

具體以下:

首先,建立一個項目文件夾jartest,在jartest目錄中創建hello包。

其次,按照如下步驟:

一、在目錄hello下編寫Hello.java(本身的類名)文件。

示例內容以下:

package hello;
public class Hello {
 public static void main(String args[]){
               System.out.println("Hello World!");
}
}

 

二、編譯生成hello.class文件。

 

三、在hello的同級目錄創建MANIFEST.MF(名字不限制)文件。

示例內容以下:

Main-Class: hello.Hello

此文件最爲重要,要點有:

M(必須大寫)ain-C(必須大寫)lass:(必須有個空格)包名.類名(必須回車)

 

四、運行明令 jar cvfm a.jar MANIFEST.MF hello/

生成a.jar

 

五、測試運行java -jar a.jar

 

六、輸出結果:

Hello World!

完整的運行過程以下:

==================================================

D:Program FilesJavasrcjartesthello>javac Hello.java

D:Program FilesJavasrcjartesthello>cd..

D:Program FilesJavasrcjartest>jar cvfm a.jar MANIFEST.MF hello/
標明清單(manifest)
增長:hello/(讀入= 0) (寫出= 0)(存儲了 0%)
增長:hello/Hello.class(讀入= 422) (寫出= 289)(壓縮了 31%)
增長:hello/Hello.java(讀入= 136) (寫出= 108)(壓縮了 20%)

D:Program FilesJavasrcjartest>java -jar a.jar
Hello World!

D:Program FilesJavasrcjartest>

==================================================

編譯後能夠將Hello.java刪除。


按照下文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" 這個錯誤。

-----------------------------------------------------------------------------------------------------------------------------------

相關文章
相關標籤/搜索