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

어떤 앱에서 다른 앱의 메소드를 호출할 때 java.lang.reflect.InvocationTargetException [closed]

0 추천
하나의 앱에서 다른 앱을 실행시켜보자!
...라는 취지에서 실험형 앱을 만들고 있습니다...
 
java.lang.reflect.InvocationTargetException
 
이런 System.err을 뱉었는데, 대체 어디에서 문제가 생겼는지 알 수가 없군요......
 
 
 
제가 원하는 것은 
 
호출 대상 앱에서
skaiser.hello
 
앱의 클래스인
public class Activity_Hello extends Activity
 
의 메소드중 하나인
public void onCreate(Bundle savedInstanceState){...}
 
이 메소드를
 
 
호출을 실행하는 앱 에서
skaiser.dcltest
 
호출을 실행하는 앱 클래스인
public class Activity_DCLTest extends Activity
 
의 메소드 중 하나인
public void onCreate(Bundle savedInstanceState){...}
 
여기에서 실행시키고자 하는 것입니다.
 
 
두 앱의 액티비티, 그러니까 클래스는 하나씩 밖에 없습니다.
 
 
호출 받는 앱의 소스코드는 다음과 같습니다.
package skaiser.helloworld;

public class Activity_Hello extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_hello);
		
		Log.i("onCreate", "onCreate");
	}

	public void Log()
	{
		Log.i("LOG","HelloWorld!!!!");
	}
}

 

 
 
호출하는 앱의 소스코드는 다음과 같습니다.
 
 
package skaiser.dcltest;

public class Activity_DCLTest extends Activity
{
	protected void onCreate(Bundle savedInstanceState)
	{
...

Class<?> cls;

//DexClassLoader로 미리 저장해둔
// APK 파일로부터 ODex파일을 생성하고,
//클래스를 로드합니다.
DexClassLoader dcl
       = new DexClassLoader(apk_Path,
                            odex_Path,
                            null,
                            this.getClass().getClassLoader() );

//DexclassLoader에서 로드한 클래스를 cls에 저장합니다.
cls = dcl.loadClass("skaiser.helloworld" + "." + "Activity_Hello");
Log.i("cls", cls.toString());

//DexClassLoader에서 로드한 클래스를 새로운 오브젝트로 만듭니다.
Object obj = cls.newInstance();
Log.i("obj", obj.toString());

//=================================================================
//실험 대조군을 위하여 집어넣은 부분
//skaiser.helloworld 패키지의
//Activity_Hello 액티비티에
//Log()라는 메소드를 추가했습니다.
//단순히 Log.i를 출력하는 메소드입니다.
//이 부분은 정상적으로 작동했습니다.
//=================================================================
Method l = cls.getMethod("Log");
Log.i("Method", l.toString());
l.invoke(obj);
//=================================================================


//=================================================================
//호출한 onCreate 메소드를 불러옵니다.
//여기서 문제가 생기는군요....
//================================================================= 
//onCreate 메소드를 불러옵니다.
Method m = cls.getMethod("onCreate", Bundle.class);
Log.i("Methodm", m.toString());
m.invoke(obj, new Bundle());
}

 

 
위의 프로그램을 돌려서 찍은 Log.i들은 다음과 같습니다.
 
Tag Text
cls class skaiser.helloworld.Activity_Hello
obj skaiser.helloworld.Activity_Hello@40cee5c8
Methodl public void skaiser.helloworld.Activity_Hello.Log()
Methodm public void skaiser.helloworld.Activity_Hello.onCreate(android.os.Bundle)
 
여기 이후로 에러메세지가 뜹니다.
 
패키지 이름, 클래스, 메소드 전부 정상적으로 읽는것 같은데... 대체 왜... ㅡㅜ
 
이 문제는 어떤 문제이며, 어떻게 해결해야 하는 것이겠습니까?
질문을 종료한 이유: 제가 아는 지식이 짧아 명확하지 못한 질문을 했기 때문입니다.
스케이져 (180 포인트) 님이 2013년 7월 25일 질문
스케이져님이 2013년 7월 26일 closed
로그캣 에러메시지를 보여주시면 아마 좋은 답변들이 달릴겁니다.
...