簡體   English   中英

如何創建可被多個Android項目重用的類的jar文件?

[英]How do you create a jar file of classes that can be re-used by multiple Android projects?

這是我到目前為止所遵循的步驟,沒有運氣。 我對Java項目非常陌生,因此我懷疑我可能缺少明顯的東西。

使用Eclipse,我創建了一個名為TestSDK的簡單Java項目,該項目在名為com.test.testsdk的包中以及以下類中創建:

package com.test.testsdk;
public class TestClass {
    public void TestMethod() {
    }
}

編譯時不會出現錯誤或警告。

然后,我使用Eclipse和標准的導出選項(導出生成的類文件和資源,壓縮JAR的內容,生成清單文件)將其導出為JAR文件(TestSDK.jar)。 我嘗試過密封和不密封JAR,這沒有什么區別。

然后,我從向導列表中的文件->新建->項目創建一個新的Android應用程序項目。 它可以在Android模擬器和我的測試設備上編譯並運行,而不會發出警告或錯誤(我收到了hello world消息)。

然后,我添加對我的TestSDK.jar文件的引用(使用多種不同的方法,稍后將對其進行擴展),將其導入到主要(也是唯一的)Android活動中,並嘗試實例化TestClass並對其調用TestMethod,像這樣:

package com.apptest.mobilesdktestapp;

import android.app.Activity;
import android.os.Bundle;

import com.test.testsdk.TestClass;

public class MobileSDKTestAppActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TestClass test = new TestClass();
        test.TestMethod();
    }
}

這樣編譯就可以,沒有警告或錯誤。 但是,當嘗試在模擬器或設備上運行它時,在LogCat窗口中出現以下錯誤:

AndroidRuntime    Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime    java.lang.NoClassDefFoundError: com.test.testsdk.TestClass

在Web上搜索NoClassDefFoundError會產生許多有關如何導入JAR文件以使類路徑正確的建議。 結果,我嘗試了以下所有導入JAR文件的方法:

  1. 在項目屬性中的Java Build Path的Libraries選項卡中,“添加外部JAR ...”,然后在Order and Export選項卡中檢查(或不檢查,我同時嘗試了)JAR。 還嘗試將JAR移至“訂購和出口”列表的頂部,這沒有什么區別。

  2. 在項目中創建一個“ libs”文件夾,然后在其中添加JAR。 我確認JAR隨后也添加到了項目列表中的“ Android Dependencies”中。 還嘗試右鍵單擊JAR文件,然后選擇“構建路徑”->“添加到構建路徑”,這沒有什么區別。

  3. 將JAR移至我的Android應用程序項目目錄中,然后執行“添加JAR ...”而不是步驟1中的外部JAR,還包括是否導出以及是否將其移至訂單列表頂部的所有排列。

隨后,我下載了打包為JAR文件的其他第3方SDK,並將它們包含在同一Android應用程序項目中,並且使用上述3種方法中的任何一種都可以正常工作(我可以從這些SDK實例化類並使用他們沒有錯誤),這使我相信我在我的TestSDK項目和/或類中遺漏了某些東西或做錯了什么,從而阻止了它在Android Application項目中使用。

就像我說的那樣,我對Java還是很陌生,所以我希望它被我忽略了。 任何幫助或指導,將不勝感激。

如果您使用的是R17或更高版本的Android工具以及Eclipse中的ADT,那么#2的第一句話就是正確的答案; 您的問題中列出的所有其他內容,充其量是沒有必要的,或者在最壞的情況下是有害的。

我建議您創建一個干凈的項目,創建測試活動,創建libs/文件夾,將JAR復制到libs/文件夾中,將代碼復制到JAR的API中,進行編譯並運行。 如果這行得通,那么您以前的工作仍然會在您以前的工作中留下很多困擾您的東西。 如果失敗,則說明發生了相當奇怪的事情。 JAR本身可能很好,否則您將得到編譯錯誤。

我想我知道了問題所在(或者至少是解決問題的方法,但我仍然不確定100%做到了)

當我創建原始的TestSDK Java項目時,我讓它以項目創建對話框(jre7)中的默認JRE為目標。

檢查新的Android應用程序項目的項目屬性,“ Java編譯器”部分的“編譯器符合級別”設置為1.5。 因此,我嘗試再次重新創建TestSDK項目,但是告訴它使用J2SE-1.5作為執行環境,而不是使用默認的jre7。

完成此操作后,導出JAR並將其導入到Android項目的libs目錄中,我現在可以實例化TestSDK類,並且可以正常使用它們而沒有NoClassDefFoundError異常。

最好的猜測是,Android應用程序是針對比我的TestSDK類(我相信針對JavaSE-1.7)更舊的JRE版本編譯的,從而導致了問題。 匹配兩個版本已經解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM