하나의 앱에서 다른 앱을 실행시켜보자!
...라는 취지에서 실험형 앱을 만들고 있습니다...
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)
여기 이후로 에러메세지가 뜹니다.
패키지 이름, 클래스, 메소드 전부 정상적으로 읽는것 같은데... 대체 왜... ㅡㅜ
이 문제는 어떤 문제이며, 어떻게 해결해야 하는 것이겠습니까?