用Android Studio编译打开Android APK
1、首先我们需要准备一些工具和环境,安装Android Studio,为了和我的环境保持一致,建议安装4x以上版本,最新版本最优。
由于原始的刺客里面的Android Studio工程比较旧了,不建议在那个基础上进行开发了,当然你有一定的Android基础可以改造。
最新Android Studio空工程和全部准备好的工具包(下载地址在最底部)。空工程的意思是全套可编译环境,不包含游戏源码,源码你还是用你自己的。
包含Android Studio空工程,Android SDK NDK JDK 如下图:
2、你的Android Studio工程结构应该是如下图这样的
打开这个目录Clientproj.android-studioappsrcmainassets 你能看到游戏的资源目录,之前我们用Cocos Studio打包的资源在Resources目录内,我们可以手动将Resources内的文件拷贝到assets目录下。
3、对于一个项目来说,有了资源还有有源代码才能运行,源代码之前我们是用VS2017进行修改的,是C++的代码,源代码所在的目录是
这是我们游戏的客户端源代码,打包Android安装包,当然也要编译这些C++代码,在Android中,需要将这些代码编译成后缀为so的库文件,Android才能加载运行,如下图:
也就是说这些C++代码编译成功后就是这些so文件。
4、先看下编译引用目录的问题,Android想要编译这些文件全部依赖于工程中的一个编译文件,就是Android.mk,这个文件里面包含了要编译的文件的位置,你要根据你的文件放置的位置进行修改。
需要找到这些C++文件才知道要编译哪些文件,你可以按照我的结构进行放置,这样就不用修改编译文件了。
上图这4个文件是打包必须的,一个都不能少。
5、NDK配置,以及其他环境变量
先做一个一键配置环境变量的脚本,这样方便。
新建一个txt文件,复制内容后,修改后缀为bat。记得路径改成你自己的。
包含的环境有jdk1.7,ndk-r10d,android sdk cocos
@echo off setx /M JAVA_HOME E:projecttoolsjdk1.7 setx /M CLASSPATH %JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar setx /M NDK_ROOT E:projecttoolsandroid-ndk-r10d setx /M ANDROID_SDK_ROOT E:projecttoolssdk setx /M ANT_ROOT E:projecttoolsant1.9.2 setx /M NDK_MODULE_PATH E:projectymcqClientcocos2dcocos set path_=%Path% setx /M "Path" "%path_%;%JAVA_HOME%bin;%JAVA_HOME%jrebin;%ANDROID_SDK_ROOT%sdkplatform-tools;%ANDROID_SDK_ROOT%sdktools;%ANT_ROOT%bin" pause
你可以像我这样,红箭头的是这个游戏需要的。
电脑上的环境变量配置好后,Android Studio的也检查一下,找到local.properties文件。
6、一些都准备好了,就开始编译吧,点击Android Studio 底部的终端Terminal,进入到工程的jni目录。
输入ndk-build -j4 回车, 开始编译,其中-j4 表示我电脑是4核,如果你电脑是8核,你就用-j8 这样编译速度后大幅提升。
清楚缓存命令 ndk-build clean
6、如果代码没问题,编译完成后,你就能看到新编译的so文件了,之后运行和打包,你可以直接用数据线连接电脑,手机打开开发者模式,可以直接运行到手机
客户端源码编译时如果错误:Class/tools/CharsetConvert
修改代码:增加const
size_t ret = iconv(cd, (const char**)&tmpin, inlen, &tmpout, outlen);
你也可以打包成apk文件安装,打包后的安装文件位置:proj.android-studioappbuildoutputsapkrelease
7、额外多说一点,签名文件,版本修改,在build.gradle里可以修改app的版本号,如果要更换签名文件到工程中找到key.properties
8、程序的入口是AppActivity,下面是我修改过的纯净的源码
package org.cocos2dx.cpp; import org.cocos2dx.lib.Cocos2dxActivity; import org.fmod.FMOD; import android.os.Bundle; import android.view.WindowManager; import android.app.AlertDialog; import android.content.DialogInterface; import android.view.KeyEvent; public class AppActivity extends Cocos2dxActivity { static { //用于程序开始运行时导入fmod.jar System.loadLibrary("fmodL"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //启动FMOD功能 FMOD.init(this); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } @Override protected void onDestroy() { super.onDestroy(); //关闭FMOD功能 FMOD.close(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exitGame(); return true; } return super.onKeyDown(keyCode, event); } public void exitGame() { new AlertDialog.Builder(this) .setTitle("提示") .setMessage("确定要退出游戏吗?") .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); } }) .show(); } }
文章转载自YmBok 作者:还如一梦中