【发布时间】:2016-01-17 16:39:45
【问题描述】:
我在运行时使用 DexClassLoader 类从 SD 卡加载 jar 文件
final String libPath = Environment.getExternalStorageDirectory() + "/test.jar";
final File tmpDir = getDir("dex", 0);
final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("org.shlublu.android.sandbox.MyClass");
final Object myInstance = classToLoad.newInstance();
final Method doSomething = classToLoad.getMethod("doSomething");
doSomething.invoke(myInstance);
在我的 jar 文件中,我正在打印一些运行良好的日志。现在我要做的是从 jar 文件中打印一个 Toast。这样做时,我得到的异常是 java.lang.reflect.InvocationTargetException。我知道为什么我们会得到这个异常,它背后的原因是在打印 toast 时使用它的上下文中的空指针异常。所以它不是重复的
What could cause java.lang.reflect.InvocationTargetException?
原因是
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
jar 文件中的代码是
public class MyClass extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
public void doSomething() {
Toast.makeText(getApplicationContext(), "MyClass: doSomething() called.", Toast.LENGTH_LONG).show();
Log.e(MyClass.class.getName(), "MyClass: doSomething() called.");
}}
任何人都可以帮助我实现这一目标。任何帮助将不胜感激。
编辑: 我想要做的是我有一个我自己的库,我的许多客户都在使用它......我想要的是从用户的 SD 卡加载我的库..我想在我想要的时候更新这个库在用户不知情且没有任何版本更新的情况下。库包含很少的接口、片段和活动。所以现在我能够从 sd 卡加载我的库并可以调用基本函数。现在主要的挑战是从库中实现接口并调用其中使用上下文的函数。
任何涉及此类操作的示例或提示都会很有帮助。
【问题讨论】:
-
@Boss 异常不是我的问题。我知道它的原因。我需要帮助来实现所需的东西..所以它不是那个 java.lang.reflect.InvocationTargetException 问题的重复
-
...是的,它是重复的...您需要解开此异常以了解导致它的原因...
-
@selvin 请仔细阅读我编辑的问题,我已经知道原因。我只是问了解决方法。谢谢
-
好的...错误很明显...您的类正在扩展活动或服务...您自己创建它的实例...然后在
doSomething中调用@987654327 @ ...
标签: android