簡體   English   中英

如何將jar文件保持在外部,但仍在我的Android項目中使用其類?

[英]How to keep a jar file external but still use its classes in my Android project?

我需要在Android項目的main / assets目錄中找到一個jar文件。 jar文件位於此處很重要。

在我的主要Android項目中,有沒有一種方法可以在我的代碼中引用此jar文件並使用其類?

為了清楚起見,我不想在編譯后將jar添加到主項目中。

編輯 :我嘗試了下面的鏈接,它似乎加載了我已經說過的類文件。 但是我在努力為動態加載的類定義構造函數參數。

android-custom-class-loading-sample

編輯2

就快到了。 我已經確認該類是從我的classes.jar中加載的。 我仍然實例化它。

在licenseValidatorClazz.getConstructor行上,出現以下錯誤。 我猜我接口文件中缺少什么?

java.lang.NoSuchMethodException:[interface com.google.android.vending.licensing.Policy,interface com.google.android.vending.licensing.DeviceLimiter,interface com.google.android.vending.licensing.LicenseCheckerCallback,int,類java .lang.String,類java.lang.String]

    public Class licenseValidatorClazz = null;
    public LicenseValidator validator;

    ...

    // Initialize the class loader with the secondary dex file.
    DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),
    optimizedDexOutputPath.getAbsolutePath(),
    null,
    mContext.getClassLoader());

        try {
            // Load the library class from the class loader.
            licenseValidatorClazz = cl.loadClass("com.google.android.vending.licensing.LicenseValidator");

            validator = (LicenseValidator) licenseValidatorClazz.getConstructor(Policy.class,DeviceLimiter.class,LicenseCheckerCallback.class,int.class,String.class,String.class).newInstance(ddd, new NullDeviceLimiter(),
                    callback, generateNonce(), mPackageName, mVersionCode);

        } catch (Exception exception) {
            // Handle exception gracefully here.
            exception.printStackTrace();
        }

我有一個接口,其中包含要傳遞給已加載類的函數。

public interface LicenseValidator
{
    public LicenseCheckerCallback getCallback();
    public int getNonce();
    public String getPackageName();
    public void verify(PublicKey publicKey, int responseCode, String signedData, String signature);
    public void handleResponse(int response, ResponseData rawData);
    public void handleApplicationError(int code);
    public void handleInvalidResponse();
}

要使用外部jar與您的應用程序關聯並在運行時使用它,它必須為dalvik格式,因為普通jar無法在dalvikVM下工作。

  1. 使用dx工具轉換文件
  2. 使用aapt cmd,將這些classes.dex添加到您的jar文件中。
  3. 現在可以將包含dalvik格式文件的jar加載到我們的項目中。

是一則帖子,解釋了完成該操作的過程。

有一些步驟可以做到這一點。

  1. 您必須將JAR文件的副本復制到應用程序的專用內部存儲中。

    1. 使用android文件夾中的dx工具,您必須生成與JAR文件關聯的classes.dex文件。 dx工具將位於/android-sdks/build-tools/19.0.1的位置(Dalvik VM需要此文件,dalvik VM無法讀取jar))

    2. 使用同樣位於同一位置的aapt工具命令,您必須將classes.dex添加到JAR文件中。

可以使用DexClassLoader動態加載 JAR文件。

如果要從任何一個自己的庫制作JAR,則每次庫源代碼發生更改時,都必須執行步驟(1-4)。 因此,您可以通過創建Shell腳本(在Mac / Linux / Ubuntu中)或批處理腳本(在Windows中)來自動化此步驟。 您可以參考此鏈接以了解如何編寫Shell腳本。

注意:實現此方法的一種情況是,無法將JAR文件直接添加到核心項目的構建路徑中,並且需要在運行時動態加載。 在正常情況下,可以將JAR文件添加到構建路徑。

請檢查此鏈接以獲取詳細的代碼和實現。

如何在運行時加載jar文件

Android:如何從JAR文件動態加載類

希望這可以幫助!!

您應該嘗試使用Services API- java.util.ServiceLoader

您可以在jar中定義服務接口及其實現。

 package com.my.project;
 public interface MyService { ... }
 public class MyServiceBarImpl implements MyService { ... }
 public class MyServiceFooImpl implements MyService { ... }

然后,在META-INF / services /目錄中定義jar文件中包含的服務。 例如,在文件“ META-INF / services / com.my.project.MyService”中,您列出了提供程序類。

# Known MyService providers.
com.my.project.MyServiceBarImpl  # The original implementation for handling "bar"s.
com.my.project.MyServiceFooImpl  # A later implementation for "foo"s.

然后,在您的主代碼庫中,可以使用ServiceLoader實例化MyService實例:

for (MyService service : ServiceLoader.load(MyService.class)) {
    //Perform some test to determine which is the right MyServiceImpl
    //and then do something with the MyService instance
}

這些示例幾乎直接從API中獲取,盡管我已經更改了程序包名稱,以使它們的讀取變得不那么麻煩。

暫無
暫無

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

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