마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 다른 앱에서 다른 앱의 onCreate(Bundle savedInstanceState) 메소드 불러오기

0 추천
제가 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도 아닌데... 대체 뭐죠....?
스케이져 (180 포인트) 님이 2013년 7월 25일 질문
classNotFoundException 이 나오는데 원인좀 알수있을까요? loadclass에
참조할 apk파일의 패키지를 썼는데 아닌가요?

1개의 답변

+1 추천
 
채택된 답변
new Bundle()
Darklake (720 포인트) 님이 2013년 7월 25일 답변
스케이져님이 2013년 7월 25일 채택됨
감사합니다.
new Bundle()을 인자로 사용하니 제대로 읽어들인것 같습니다.
'같습니다'라는 애매한 표현을 사용한 이유는, 사실 원하는 결과가 실행되지 않고 에러메세지를 뱉어서인데요,
java.lang.reflect.InvocationTargetException
이러한 에러를 뱉었다는 말은 인자로 넘긴 값이 맞기 때문이라고 생각합니다.
위 에러의 원인은 public onCreate 에서 super.onCreate 를 부르지 않아서 그런것같은데요. 한번 super.onCreate 를 호출해보시죠
...