제가 DexClassLoader를 활용한 앱을 만들려고 하는데요,
같은 앱, 그러니까 동일한 앱 내부에서가 아닌
다른 앱에서 다른 앱에 있는 메소드를 호출해 보려고 합니다.
skaiser.DCLTest 라는 패키지 명 가진 앱이,
skaiser.HelloWorld 라는 패키지 명을 가진 앱의,
Public onCreate(Bundle savedInstanceState) 이라는 메소드를 실행시키는 것입니다.
(물론 기본적으로 onCreate는 Protected로 되어있어 호출이 불가능합니다만,
이번에 실험을 위하여 일부러 Protected만 Public으로 전환하였습니다.)
//그냥 로그만 띄워서 확인하려고 만들었기 때문에
//대충 이런식으로 되어있습니다.
//심플하죠?
public void onCreate(Bundle savedInstanceState)
{
Log.i("Tag_onCreat", "Success!");
}
일단 skaiser.DCLTest 패키지 에서,
DexClassLoader를 활용하여,
skaiser.HelloWorld 패키지의 Public onCreate(Bundle savedInstanceState)메소드를
호출하는데 까지는 성공한것 같습니다.
//클래스를 cls라고 선언합니다.
Class<?> cls;
//DexClassLoader로 미리 저장해둔 APK 파일로부터 ODex파일을 만들고,
//클래스를 로드합니다.
DexClassLoader dcl
= new DexClassLoader(apk_Path,
dex_Path,
null,
this.getClass().getClassLoader() );
//DexclassLoader에서 로드한 클래스를 cls에 저장합니다.
cls = dcl.loadClass("skaiser.helloworld" + "." + "Activity_Hello");
//DexClassLoader에서 로드한 클래스를 새로운 오브젝트로 만듭니다.
Object obj = cls.newInstance();
//onCreate 메소드를 불러옵니다.
Method m = cls.getMethod("onCreate", Bundle.class);
//==================================================================
//마지막 호출한 메소드를 실행시키는 부분에서 문제가 생겼습니다......
//==================================================================
m.invoke(obj, Bundle.class);
문제는 메소드를 실행시키려고 집어넣은
invoke에서 일어났습니다...
이 부분에서
java.lang.IllegalArgumentException:
argument 1 should have type android.os.Bundle, got java.lang.Class<android.os.Bundle>
이러한 System.err 를 출력합니다...
m.invoke(obj, Bundle.class);
아무래도 이 부분에서 Bundle.class를 사용하면 안된다고 말하는거 같은데
대체 뭘 넣어야 할지 막막해 지는군요... ㅡㅜ
Int도 Char도 아닌데... 대체 뭐죠....?