【问题标题】:how can you dynamically load an Android activity or class from an external jar file?如何从外部 jar 文件动态加载 Android 活动或类?
【发布时间】:2011-12-24 22:09:08
【问题描述】:
这个问题实际上有几个部分:
如何创建可以动态加载的外部 jar 文件?您可以将 .apk 文件加载为 .jar 文件吗?你可以加载 classes.dex 吗?是否需要使用dx工具转换jar文件才能做到这一点?
-
我看到这段代码动态加载一个类:
String jarfile = "test2.jar";
DexClassLoader classloader = new DexClassLoader(
jarfile, "/tmp", null, getClass().getClassLoader());
Class<?> myclass = classloader.loadClass("Test2Activity");
在这种情况下,jar 文件应该放在哪里?换句话说,当我安装我的主要 android 应用程序时,我需要 test2.jar 文件的路径。
感谢您的帮助。
【问题讨论】:
标签:
android
class
load
dynamic
【解决方案2】:
我实际上正在寻找类似的答案 -
我设法找到了一种将 jar 文件动态加载到 android 应用程序的方法 - 就在此处通过此链接堆栈溢出:
-您需要的一切都在这里-除了我在链接下方添加了一些我花时间试图弄清楚的东西-这可能对您有用
http://stackoverflow.com/questions/11453614/how-can-i-load-a-jar-file-dynamically-in-an-android-application-4-0-3
请注意以下几点:
创建.jar时:只需要需要动态加载的.class文件——不需要在.jar文件中包含接口IPeripheral。
使用 IDE 构建 .jar 文件 - 我不会使用以下命令来编辑通过在命令行中调用 jar 选项生成的默认清单文件 - 像这样:“jar cmf manifest-addition jar-文件输入文件”。而是打开 Eclipse,转到 File> Export > Java> Jar File 并按照它进行操作。
在选择manifest文件时——选择customized,只需在项目中将manifest文件创建为无标题文本文件并保存为whatever.manifest确保该文本文件末尾有一行空文件!
-
在上面链接的示例代码中:确保仔细检查此行的实际作用:
dalvik.system.PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(urls.get(index).toString(), ModuleLoader.class.getClassLoader());
我之所以这么说是因为 urls.get(index).toString() 会返回 file:/pathname,而你想要的只是路径名。我只是简单地把它解析出来让它工作。
要创建 SDCard - 只需从 android 设备管理器中进行 - 有一个设置外部存储的选项 - 选择大小。在 DDMS 中,您将能够打开“文件资源管理器”,您将在 mnt 文件夹中找到 sdcard,并能够将您的 jar 文件推送到 sd 卡文件夹中。
-
这就是我的 Main_activity 类的样子,它调用了模块加载器。
public class MainActivity extends Activity
{
private static Context context;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Get this classes context
MainActivity.context = getApplicationContext();
// method to return a list of modules that all implement the interface IPeripheral
List<IPeripheral> modules = ModuleLoader.loadModules("/mnt/sdcard", getApplicationContext());
//Accessing a method - and display is just a method that toasts.
display(modules.get(0).getName());
}
}
希望这会有所帮助 - 我认为您不可能动态添加实际上是“屏幕”或 android 活动的 Java 文件的 jar 文件,因为这需要您以编程方式编辑 Projects Android Manifest File您正在尝试将 jar 动态加载到其中。我认为这是不可能的,因为它会带来安全风险。