Android动态加载libgdx小游戏

KeithKnight 2013-12-03 03:38:41
楼主被这个问题困扰好几天了,跪求大神支招。

我想实现的功能同微信里面的打飞机及其类似,就是在主app中动态加载apk或者jar包中的游戏,并且这个游戏是没有安装的。

网络上也有大神分析微信该部分实现的文章(http://www.blogjava.net/zh-weir/archive/2013/10/25/402821.html),具体的实现思路就是利用DexClassLoader。但是我发现这样被加载的类更像是一个普通的java类而不具备android中activity的特性,我甚至可以把主程序的context通过构造函数传递给插件类但是却不知道怎么使用它去构建libgdx的工作环境。这也是问题所在。

下面是一部分代码,希望能帮助大家理解问题:
HOST:

    privare void LoadAPK(Bundle paramBundle, String dexpath, String dexoutputpath, String libpath) {
ClassLoader localClassLoader = ClassLoader.getSystemClassLoader();
DexClassLoader localDexClassLoader = new DexClassLoader(dexpath,
dexoutputpath, libpath, localClassLoader);
try {
PackageInfo plocalObject = getPackageManager().getPackageArchiveInfo(dexpath, 1);

if ((plocalObject.activities != null)
&& (plocalObject.activities.length > 0)) {

//
String activityname = plocalObject.activities[0].name;
Log.d(TAG, "activityname = " + activityname);
Class<?> localClass = localDexClassLoader.loadClass(activityname);
Constructor<?> localConstructor = localClass.getConstructor(new Class[] {Context.class});
// here to past host context to plugin
Object instance = localConstructor.newInstance(new Object[] {this});

Method methodonCreate = localClass.getDeclaredMethod("onCreate", new Class[] { Bundle.class });
methodonCreate.setAccessible(true);
methodonCreate.invoke(instance, new Object[] { paramBundle });
}
return;
} catch (Exception ex) {
ex.printStackTrace();
}
}

GAME PLUGIN:

public class GameActivity extends AndroidApplication {
private Game game;
private Context hostContext;

FetchingCoinActivity(Context context) {
this.hostContext = context;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

this.game = new MyGame();
AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
cfg.useGL20 = false;

// FIXME HERE IS THE PROBLEM, how to initialize libgdx environment using host context?
initialize(game, cfg);
}
}


大概就是这样了。先谢。

另外,反编译了下打飞机的源码,看到了其初始化时的相关代码如下:
  public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
AndroidApplicationConfiguration localAndroidApplicationConfiguration = new AndroidApplicationConfiguration();
localAndroidApplicationConfiguration.useGL20 = false;
new StringBuilder("getApplication().getResources ").append(getApplication().getResources().getClass().getName()).toString();
new StringBuilder("getApplicationContext().getResources() ").append(getApplicationContext().getResources().getClass().getName()).toString();
new StringBuilder("ShootFlashUI.this.getResources() ").append(getResources().getClass().getName()).toString();
this.dlm = new a(this);
a(this.dlm, localAndroidApplicationConfiguration);
FrameLayout localFrameLayout = new FrameLayout(this);
localFrameLayout.setBackgroundResource(f.background);
localFrameLayout.setLayoutParams(t());
setContentView(localFrameLayout);
addContentView(this.bi.getView(), t());
}

里面 this.dlm = new a(this); 其中a是腾讯自定义的ApplicationListener实现,它直接传的this。非常的不解。如果作为动态加载的类,他是怎么使该类具备了activity的特性的呢。

希望能获得大家的帮助,哪怕是思路,我也会尝试之后给我结果的。








...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeithKnight 2013-12-04
  • 打赏
  • 举报
回复
引用 3 楼 ultrapro 的回复:
apk 中的Activity 假如叫ApkActivity,在调用的工程里实现一个BActivity,这个BActivity的各个on方法,要通过反射机制调用ApkActivity对应的on方法。启动时候当然是启动BActivity。这样ApkActivity就起来了。
谢谢您提供的思路,因为现在有新的任务了,我会在尝试之后给出进一步的回复。
儿大不由爷 2013-12-04
  • 打赏
  • 举报
回复
引用 4 楼 KeithKnight 的回复:
[quote=引用 3 楼 ultrapro 的回复:] apk 中的Activity 假如叫ApkActivity,在调用的工程里实现一个BActivity,这个BActivity的各个on方法,要通过反射机制调用ApkActivity对应的on方法。启动时候当然是启动BActivity。这样ApkActivity就起来了。
谢谢您提供的思路,因为现在有新的任务了,我会在尝试之后给出进一步的回复。[/quote] 几年前研究过,好像某家大厂就是这么做的
儿大不由爷 2013-12-03
  • 打赏
  • 举报
回复
apk 中的Activity 假如叫ApkActivity,在调用的工程里实现一个BActivity,这个BActivity的各个on方法,要通过反射机制调用ApkActivity对应的on方法。启动时候当然是启动BActivity。这样ApkActivity就起来了。
KeithKnight 2013-12-03
  • 打赏
  • 举报
回复
引用 1 楼 birdsaction 的回复:
你反编译了代码,那个 a应该是还是加密状态。 传入this就可以获取 当前Activity Context实例。
您说的对,不过这部分并不重要,重要的是我知道了腾讯在初始化游戏环境的时候,这类是已经加载的并且是拥有activity的特性的,并且这个类是通过dexclassloader加载的。 我想知道的就是如何使通过dexclassloader加载的类是一个activity而不是一个普通的java类??
Birds2018 2013-12-03
  • 打赏
  • 举报
回复
你反编译了代码,那个 a应该是还是加密状态。 传入this就可以获取 当前Activity Context实例。

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧