用Android Studio编译打开Android APK
1、首先我们需要准备一些工具和环境,安装Android Studio,为了和我的环境保持一致,建议安装4x以上版本,最新版本最优。
由于原始的刺客里面的Android Studio工程比较旧了,不建议在那个基础上进行开发了,当然你有一定的Android基础可以改造。
最新Android Studio空工程和全部准备好的工具包(下载地址在最底部)。空工程的意思是全套可编译环境,不包含游戏源码,源码你还是用你自己的。
包含Android Studio空工程,Android SDK NDK JDK 如下图:
2、你的Android Studio工程结构应该是如下图这样的
打开这个目录Client\proj.android-studio\app\src\main\assets 你能看到游戏的资源目录,之前我们用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:\project\tools\jdk1.7
setx /M CLASSPATH %JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
setx /M NDK_ROOT E:\project\tools\android-ndk-r10d
setx /M ANDROID_SDK_ROOT E:\project\tools\sdk
setx /M ANT_ROOT E:\project\tools\ant1.9.2
setx /M NDK_MODULE_PATH E:\project\ymcq\Client\cocos2d\cocos
set path_=%Path%
setx /M "Path" "%path_%;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%ANDROID_SDK_ROOT%\sdk\platform-tools;%ANDROID_SDK_ROOT%\sdk\tools;%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-studio\app\build\outputs\apk\release
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();
}
}
本站内容来源于作者发布和网络转载,如有版权相关问题请及时与我们取得联系,我们将立即删除。