获得;java.lang.reflect.InvocationTargetException“;尝试注册嵌入式apk的广播接收器时

获得;java.lang.reflect.InvocationTargetException“;尝试注册嵌入式apk的广播接收器时,java,android,dynamic,reflection,Java,Android,Dynamic,Reflection,我的应用程序有一个嵌入式APK,我需要在主APK的内部APK中注册一个BroadcastReceiver 系统上不安装内部APK;我必须动态加载它。因此,我使用反射来调用内部APK中的一个方法,该方法具有注册广播接收器的代码。内部APK的接收器应调用相关广播 尝试注册广播接收器时出错。BroadcastReceiver是否有可能以这种方式注册并完全正常工作?例外情况和代码如下所示 错误相关日志: 08-24 08:31:26.915: D/MainApp(1957): invoke method

我的应用程序有一个嵌入式APK,我需要在主APK的内部APK中注册一个
BroadcastReceiver

系统上不安装内部APK;我必须动态加载它。因此,我使用反射来调用内部APK中的一个方法,该方法具有注册
广播接收器的代码。内部APK的接收器应调用相关广播

尝试注册
广播接收器时出错。
BroadcastReceiver
是否有可能以这种方式注册并完全正常工作?例外情况和代码如下所示

错误相关日志:

08-24 08:31:26.915: D/MainApp(1957): invoke method
08-24 08:31:26.955: D/InnerApp(1957): Register receiver
08-24 08:31:26.955: W/System.err(1957): java.lang.reflect.InvocationTargetException
08-24 08:31:26.965: W/System.err(1957):     at java.lang.reflect.Method.invokeNative(Native Method)
08-24 08:31:26.965: W/System.err(1957):     at java.lang.reflect.Method.invoke(Method.java:515)
08-24 08:31:26.965: W/System.err(1957):     at com.example.ea_mainapp.MainApp.invokeService(MainApp.java:105)
08-24 08:31:26.965: W/System.err(1957):     at com.example.ea_mainapp.MainApp.onCreate(MainApp.java:40)
08-24 08:31:26.965: W/System.err(1957):     at android.app.Activity.performCreate(Activity.java:5231)
08-24 08:31:26.975: W/System.err(1957):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-24 08:31:26.975: W/System.err(1957):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
08-24 08:31:26.975: W/System.err(1957):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
08-24 08:31:26.975: W/System.err(1957):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-24 08:31:26.975: W/System.err(1957):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-24 08:31:26.975: W/System.err(1957):     at android.os.Handler.dispatchMessage(Handler.java:102)
08-24 08:31:26.975: W/System.err(1957):     at android.os.Looper.loop(Looper.java:136)
08-24 08:31:26.975: W/System.err(1957):     at android.app.ActivityThread.main(ActivityThread.java:5017)
08-24 08:31:26.975: W/System.err(1957):     at java.lang.reflect.Method.invokeNative(Native Method)
08-24 08:31:26.975: W/System.err(1957):     at java.lang.reflect.Method.invoke(Method.java:515)
08-24 08:31:26.975: W/System.err(1957):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-24 08:31:26.975: W/System.err(1957):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-24 08:31:26.975: W/System.err(1957):     at dalvik.system.NativeStart.main(Native Method)
08-24 08:31:26.985: W/System.err(1957): Caused by: java.lang.NullPointerException
08-24 08:31:26.985: W/System.err(1957):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:467)
08-24 08:31:26.985: W/System.err(1957):     at com.example.ea_innerapp.InnerApp.register(InnerApp.java:50)
08-24 08:31:26.985: W/System.err(1957):     ... 18 more`
主应用程序的相关代码:

// invoke method
Log.d(TAG,"invoke method");

final String apkFile =TARGET_BASE_PATH+"EA_innerApp.apk";
String className = "com.example.ea_innerapp.InnerApp";
String methodToInvoke = "register"; 

final File optimizedDexOutputPath = getDir("outdex", 0);

DexClassLoader dLoader = new DexClassLoader(apkFile,optimizedDexOutputPath.getAbsolutePath(),
                null,ClassLoader.getSystemClassLoader().getParent());

try {
    Class<?> loadedClass = dLoader.loadClass(className);
    Object obj = (Object)loadedClass.newInstance();
    @SuppressWarnings("rawtypes")
    Class noparams[] = {};
    Method m = loadedClass.getMethod(methodToInvoke, noparams);
    Object oNoparams[] = {};
    m.invoke(obj, oNoparams);
} catch (ClassNotFoundException e) {....
} catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我已经解决了这个问题

问题识别:

比赛的主要部分是

08-24 08:31:26.985: W/System.err(1957): Caused by: java.lang.NullPointerException
08-24 08:31:26.985: W/System.err(1957):     at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:467)
08-24 08:31:26.985: W/System.err(1957):     at com.example.ea_innerapp.InnerApp.register(InnerApp.java:50)
我查看了“android.content.ContextWrapper.registerReceive”的代码以找到主要原因。ContextWrapper类的相关代码如下所示

464    @Override
465    public Intent registerReceiver(
466        BroadcastReceiver receiver, IntentFilter filter) {
467        return mBase.registerReceiver(receiver, filter);
468    }
参考号:

错误出现在第467行,即
“return mBase.registerReceiver(receiver,filter);”
。在这里,mBase是类“android.content.Context”的对象。 类“com.example.ea_innerapp.innerapp”中上下文的值为null,因为它是嵌入式apk的类。这就是为什么我会有例外

解决方案:

我需要提供一个上下文值。所以,我将主apk的上下文作为参数传递给“com.example.ea_innerapp.innerapp.register”

“com.example.ea_innerapp.innerapp.register”调用的是“android.content.ContextWrapper.registerReceive”,它不接收上下文作为参数。因此,我直接调用了“android.content.Context.registerReceiver”,使用main apk提供的上下文。修改后的“com.example.ea_innerapp.innerapp.register”为

请注意,您必须保存param_ctx的值,并在取消注册receiver时使用它,否则会出现错误。若要取消注册收件人,您将呼叫

ctx.unregisterReceiver(obj_InnerReceiver); // ctx is the value that was passed to "com.example.ea_innerapp.InnerApp.register"

您是否调查了内部(原因)NullPointerException?似乎是com.example.ea_innerapp.innerapp.register调用堆栈中的某个地方出现的问题,但该数据在您的帖子中不可用。@MatjažPečan:“com.example.ea_innerapp.innerapp.register”是主应用程序调用的方法。此方法的代码在帖子中给出,我将编辑标题以使其清晰。此方法只需注册一个广播接收器。在我的测试过程中,内部应用程序独立运行良好,但当我调用内部apk的此方法(未安装在系统上)时,我在调用方法“registerReceiver”以注册Receiver的行中遇到异常我不确定问题是什么,我想可能与上下文有关,但我不知道如何修复它,因为您是从内部APK调用它的,是否有可能因为这个原因它内部的某些内容可能是空的?您正在加载一个类,对其进行实例化,然后对其调用register,是否可能因此而缺少一些引用?在调用register之前,您可能应该在其中填充更多字段,obj_innerReceiver引用来自何处,它是否在构造函数中初始化?“obj_innerReceiver”定义为类“com.example.ea_innerapp.innerapp.register”的私有变量。确切的语句是“private InnerReceiver obj_InnerReceiver=new InnerReceiver();”。我想我应该尝试将它公开,并在构造函数中实例化它。
public void register(Context param_ctx){        
        ......
        param_ctx.registerReceiver(obj_InnerReceiver,filter);   
    }
ctx.unregisterReceiver(obj_InnerReceiver); // ctx is the value that was passed to "com.example.ea_innerapp.InnerApp.register"