![](/img/trans.png)
[英]How to use an external class in a JAR file as one of the classes in my program?
[英]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下工作。
這是一則帖子,解釋了完成該操作的過程。
有一些步驟可以做到這一點。
您必須將JAR文件的副本復制到應用程序的專用內部存儲中。
使用android文件夾中的dx工具,您必須生成與JAR文件關聯的classes.dex文件。 dx工具將位於/android-sdks/build-tools/19.0.1的位置(Dalvik VM需要此文件,dalvik VM無法讀取jar))
使用同樣位於同一位置的aapt工具命令,您必須將classes.dex添加到JAR文件中。
可以使用DexClassLoader動態加載此 JAR文件。
如果要從任何一個自己的庫制作JAR,則每次庫源代碼發生更改時,都必須執行步驟(1-4)。 因此,您可以通過創建Shell腳本(在Mac / Linux / Ubuntu中)或批處理腳本(在Windows中)來自動化此步驟。 您可以參考此鏈接以了解如何編寫Shell腳本。
注意:實現此方法的一種情況是,無法將JAR文件直接添加到核心項目的構建路徑中,並且需要在運行時動態加載。 在正常情況下,可以將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.