关于cocos2d引擎写的手游加速

公司的需求,需要做手游端加速
ios端搜到对应的代码,进行hook gettimeofday这个linux底层函数实现了

做安卓端的我有点懵,网上也搜不到相应资源,仿造着ios写了jni,中间遇到了很多坑,最后实现了

简单讲下吧,方便后来人

1.JNI肯定是要写的,但是hook底层函数怎么做?用框架Cydia Substrate(小提示,视情况用不用dvm的so,我是没用)
2.模拟器上写了无效果,注意安卓系统版本,模拟器上需要用dlopen去hook才能生效,MSGetImageByName没啥卵用,一直返回image为空
3.主要jni如下(**

整个贴出来吧,问光环客服还 “这能告诉你么,商业机密!” 个毛线,不值钱的玩意看的比什么都金贵

**)

include

include

include

include “include/substrate.h”

define TAG “HOOKDEMO”

define LOGE(…) android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS)

define GETLR(store_lr)\

__asm__ __volatile__(   \
    "mov %0, lr\n\t"    \
    :   "=r"(store_lr)  \
)

void performHook(const char *targetSo, const char *symbol, void *replace, void **original);
//指明要hook的lib
MSConfig(MSFilterLibrary, “/system/lib/libc.so”)

//旧方法
int (*oldgettimeofday)(struct timeval*tv, struct timezone *tz);
//新方法
int mygettimeofday(struct timeval*tv, struct timezone *tz) {
unsigned lr;
GETLR(lr);
int ret = oldgettimeofday(tv,tz);
if(ret == 0){
tv->tv_usec *= 8; //速度8倍
tv->tv_sec *= 8;
}
return ret;
}

void* find_symbol(const char* libraryname, const char* symbolname)
{
void *imagehandle = dlopen(libraryname, RTLD_GLOBAL | RTLD_NOW);
if (imagehandle != NULL) {
void * sym = dlsym(imagehandle, symbolname);
if (sym != NULL) {
return sym;
} else {
return NULL;
}
} else {
return NULL;
}
}

//初始化时进行hook

MSInitialize{
performHook(“/system/lib/libc.so”, “gettimeofday”, (void*)&mygettimeofday, (void**)&oldgettimeofday);
}

//封装hook
void performHook(const char *targetSoPath, const char *symbol, void *replace, void **original) {
MSImageRef image = MSGetImageByName(targetSoPath);
void *symAddress;
if (image != NULL) {
//真机一般走这里
symAddress = MSFindSymbol(image, symbol);
MSHookFunction(symAddress, replace, original);
} else {
//模拟器喜欢走这里,MSGetImageByName获取不到so,必须用dlopen
symAddress = find_symbol(targetSoPath, symbol);
if (symAddress != NULL) {
MSHookFunction(symAddress, replace, original);
} else {
LOGE(“===>>>>>> find_symbol failed”);
}
}
}

4.修改速度哪里,试了4-8倍,9倍模拟器上有点卡顿抽抽,10倍无效,最低没试,因为只是加速,减速不考虑可自行测试,运行demo得到so文件

5.导入自己打好的so和Cydia Substrate框架的so,游戏主入口system.loadlibrary(“xxx”);两个so即可

然后看控制台打印,这里写图片描述

游戏疯狂的调用这个gettimeofday,作为游戏心跳,到此礼成

填补下国内安卓端搜不到类似代码的空缺吧

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值