android 项目交互 与 sdk增加指南: (完整版)
通常在处理u3d与android natvice对接时,有两种方案:
. U3D 项目交互部分方案:
a. 使用u3d带有jni与使用jar方案直接处理,原理还是在u3d直接打包apk,其实处理过程是把相关工程的目录构建好,在u3d内进行打包完成的c# 与 java进行交互,底层的ndk部分完全忽略掉了,直接用u3d提供的jni接口交互jar中的class地址即可;
b. 传统的方式,导出eclipse android工程采用ndk方式jni通信;
android 的生命周期介绍:
.制作sdk native思路: 在交互的activity中跳转到新的activity来进行显示部分;
a方案配置指南:
1.Android创建工程指南:
至少配置:(否则可能被坑)
.Minimum Required SDK: API 14 Android 4.0
.Target SDK: API 19 Android 4.4
.Compile With: API 19 Android 5.1.1
Theme: ... ...
Activity Name: ... ...
完成项目创建;
2. 项目结构:
.src: 原文件模块, 一定要追加一个包名;
.libs: 与unity对应要增加一个sdk的类库包;
.res/laytou: 布局管理模块有需求就添加;
.AndroidManifest.xml: 增加xml android项目布局器;
3. 寻找unity3d支持的libs库文件class.jar:
在u3d的安装目录下
../Contents/PlaybackEngines/AndroidPlayer/release/bin/classes.jar
../Contents/PlaybackEngines/AndroidPlayer/development/bin/classes.jar
拷贝到AndroidPlugin下的libs目录下.
进行引用一次:
建议使用release下的jar交互库;
4. 编辑要测试的布局文件:
.res/layout下的布局文件随便写,根据android native的构建原则来搞;
5. 回到src工程文件来实现部分代码:
.修改MainActivity.java:(这个文件用来跟u3d进行交互,所以不要实现 setContentView方法)
删除 setContentView(R.layout.activity_main);
删除 onCreateOptionsMenu(Menu menu);
删除 onOptionsItemSelected(MenuItem item);
增加: 需要交互的方法 (c#(u3d) / java);
public void StartActivity1(String name) { // u3d call android
// // TODO Auto-generated method stub
// Intent intent = new Intent(mContext,OpenActivity1.class);
// intent.putExtra("name", name);
// mActivity.startActivity(intent);
Log.e("U3D: ", "StartActivity1: " + name);
}
public void StartActivity2(String name) //
{
UnityPlayer.UnitySendMessage("Main Camera","messgae","android call u3d sucess!!!" + name);
}
public void StartActivity3(String name) { // native 跳转 sdk等
// TODO Auto-generated method stub
Intent intent = new Intent(mContext,TestActivity0.class);
intent.putExtra("name", name);
mActivity.startActivity(intent);
}
补: 如果调试中可以使用Activity
u3d接入需要修改:
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {//UnityPlayerActivity
// 修改后要重新进入eclipse clean and build;
6. 开始打包bin下 class目录 :
.控制台打开进入当前android工程的 bin目录下:
.执行java命令行: jar -cvf class.jar *;
.打包出来的class.jar随意改名;
7.构建AndroidManifest文件
.创建activity 磨垮
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".OpenActivity1">
</activity>
增加权限文件:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
. 创建初始状态android部分构建完成;
8. 进入unity3d项目设置部分;
. 新建u3d工程;
. 创建Plugins 文件夹, 创建Android文件夹 , 创建bin 文件夹, 创建 libs文件夹, 创建 res文件夹
. 拷贝AndroidManifest 到 Android;
. 拷贝生成好的jar文件到 bin;
. 拷贝第三方库到 libs;
. 拷贝当前工程下的res内容到 res内,注意检查layout;
9. 制作相关代码:
void Start () {
#if UNITY_EDITOR
#elif UNITY_IPHONE
#elif UNITY_ANDROID
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
m_activity = jc.GetStatic<AndroidJavaObject> ("currentActivity");
#endif
}
void OnGUI(){
//call hello world
if(GUI.Button(new Rect(50,50,200,40),"Open Activity download")){
m_activity.Call("StartActivity1","Unity中调出android的方法了");
}
//call hello world
if(GUI.Button(new Rect(50,250,200,40),"Open Activity N2")){
m_activity.Call("StartActivity2","Unity中调出android的方法了222");
}
}
将脚本挂入Main Camera对象上;
10. U3D BuildSetting:
11. 打包后生成apk 文件使用;
12. 搭建tomcat web 服务器:
Mac OS:http://blog.csdn.net/kaitiren/article/details/44871181 安装;
扩展部分: (跳转一个activity来实现布局或者sdk的添加部分)
1. 回到android项目中,创建相关代码过程:
Android 增加native 测试类OpenActivity1.java:
package com.example.androidplugin;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class OpenActivity1 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text = (TextView)this.findViewById(R.id.textView1);
text.setText(this.getIntent().getStringExtra("name"));
Button close = (Button)this.findViewById(R.id.button0);
close.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
OpenActivity1.this.finish();
}
});
}
}
MainActivity.java 中:
public Context mContext = null;//增加
public Activity mActivity = null;//增加
protected void onCreate(Bundle savedInstanceState) {// 修改
super.onCreate(savedInstanceState);
mContext = this;//增加
mActivity = this;//增加
// setContentView(R.layout.activity_main);
}
public void StartActivity3(String name) // android call unity
{
Intent intent = new Intent(mContext,OpenActivity1.class);
intent.putExtra("name", name);
mActivity.startActivity(intent);
}
xml 配置:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ITFFuture.testua.MainActivity"
tools:ignore="MergeRootFrame" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="18sp"
android:background="#00FF00"
android:text="测试Unity和Android之间额通讯"
android:gravity="center_vertical|center_horizontal" />
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textSize="18sp"
android:background="#0000FF"
android:text="大家好,我是安卓的OpenActivity1"
android:gravity="center_vertical|center_horizontal" />
<Button
android:id="@+id/button0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="关闭这个OpenActivity1"/>
</LinearLayout>
</ScrollView>
AndroidManifest.xml:
<application
....
<activity
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".OpenActivity1"> (这里如果识别不到直接用包名即可)
</activity>
</application>
.编译打包到u3d的android bin文件路径下; (如果不了解查看上面第6步)
.完成java部分后记得要替换资源和 AndroidManifest.xml 到u3d中;
2. 回到u3d项目的脚本中:
//call hello world
if(GUI.Button(new Rect(50,400,200,40),"Open Activity N3")){
m_activity.Call("StartActivity3","333333");
}
. 检查项目所有部分,打包生成新的apk,提供apk ota下载部分;
. 测试完成后进入android native sdk 模块添加:
提示: 在开发交互的模块一旦继承UnityPlayerActivity后是无法调试的,开发android native部分可以使用Activity.
android工程更换后可能无法运行,直接clean处理即可;
3. Android Native sdk的增加方式:
.android native sdk 通常以jar包的形式存在,导入和引用到eclipse中的libs文件夹即可;
.同时也要引入u3d 的libs文件夹中,如果没有文件夹需要创建;(sdk 不提示了,添加方法如下)
.以上操作完成后进入下面操作,添加native sdk思路也是通过跳转到新的activity中进行的:
4. 在使用sdk即成,或者增加c# 与 java的交互模块后,可以从u3d导出android工程进行使用;
----------------------------------------
小技巧导出外存大小减少:
修改u3d中的android playersetting设置部分
--Scrpping Level * : Strip Byte Code;
--Script Call Optimization : fast