Android用のプラグインの例を作成したいので、3つのプロジェクトがあります:
ExternalLibInterface - を含みIExternalLib
、ファイルにビルドしexternallibinterface.jar
ます
package com.example.externallibinterface;
public interface IExternalLib {
public String someMethod( String param );
}
ExternalLibexternallibinterface.jar
-およびを含みSomeClass implements IExternalLib
、ビルドにexternallib.apk
package com.example.externallib;
import com.example.externallibinterface.IExternalLib;
public class SomeClass implements IExternalLib {
public String someMethod(String arg0) {
return arg0;
}
}
SomeApp - アクティビティ用のクラスが含まれていますexternallibinterface.jar
- そこから外部 apk とクラスをロードするアプリケーション。
import com.example.externallibinterface.IExternalLib;
import dalvik.system.PathClassLoader;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String apkToLoad = null;
String externalPackagePath = "com.example.externallib";
String externalClassPath = "com.example.externallib.SomeClass";
try {
apkToLoad = getPackageManager()
.getApplicationInfo( externalPackagePath, MODE_PRIVATE ).sourceDir;
} catch ( PackageManager.NameNotFoundException e ) {
e.printStackTrace();
}
PathClassLoader pathClassLoader =
new PathClassLoader( apkToLoad,
ClassLoader.getSystemClassLoader() );
try {
Class<?> c = Class.forName( externalClassPath, true, pathClassLoader );
Object someClassInstance = c.newInstance();
//exception ClassCastException here
IExternalLib i = (IExternalLib) someClassInstance;
i.someMethod( "some string" );
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch ( ClassCastException e ) {
e.printStackTrace();
}
}
}
しかし、キャストObject someClassInstance
するIExternalLib
とClassCastException
. なんで?IExternalLib
は 3 番目に定義されています ( 内externallibinterface.jar
)。