Java 如何将jar文件保持在外部,但仍在我的Android项目中使用它的类?
我需要在Android项目的main/assets目录中有一个jar文件。jar文件位于那里是很重要的 在我的主要Android项目中,有没有办法在我的代码中引用这个jar文件并使用它的类 明确地说,我不想在编译之后将jar添加到主项目中 编辑:我尝试了下面的链接,它似乎加载了我所说的类文件。但我正在研究如何为动态加载的类定义构造函数参数 EDIT2 快到了。我已经确认该类是从我的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,class java.lang.String,class java.lang.String]Java 如何将jar文件保持在外部,但仍在我的Android项目中使用它的类?,java,android,jar,import,external,Java,Android,Jar,Import,External,我需要在Android项目的main/assets目录中有一个jar文件。jar文件位于那里是很重要的 在我的主要Android项目中,有没有办法在我的代码中引用这个jar文件并使用它的类 明确地说,我不想在编译之后将jar添加到主项目中 编辑:我尝试了下面的链接,它似乎加载了我所说的类文件。但我正在研究如何为动态加载的类定义构造函数参数 EDIT2 快到了。我已经确认该类是从我的classes.jar加载的。不过,我被困在实例化它的过程中 在licenseValidatorClazz.get
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下工作
这篇文章解释了实现它的过程。您应该尝试一下服务API- 您可以在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中获取的,不过我已经更改了包名,使它们稍微不那么烦人。有一些步骤可以实现这一点
希望这有帮助 你使用的是哪种构建工具?我使用的是Android Studio。我设法使用了DX工具。我想我可以上一节简单的课。但我正试图将Android LVL库的一部分移动到一个罐子中。看起来很棘手。