unity与java相互调用
2015-10-09 19:39
766 查看
首先做一下工程准备,
将unity中关于编译Android程序的Jar包导入我们的项目中,
project - Properties - Java Build Path - Add External JARs...
Jar包路径一般为:
%Unity安装目录%\Editor\DataPlaybackEngines\androidplayer\development\bin\classes.jar
让Java的应用程序继承UnityPlayerNativeActivity,温馨提示:在Eclipes中自动import的快捷键为ctrl+shift+o,
基本秩序保留onCreate函数,然后就是写接口
首先说一下静态函数接口的调用,假设我们的java类如下:
在unity中,只需
private AndroidJavaClass jc;
jc = new AndroidJavaClass("com.Sealy.FingerTest.MainActivity");
int sum = jc.CallStatic<int>("myAdd",1,3);
搞定,这是最简单的调用类的静态方法,当然我们可以写成非静态方法,将java类写成单例,供外部调用,
例子:
然后unity调用如下:
private AndroidJavaClass jc;
jc = new AndroidJavaClass("com.Sealy.FingerTest.MainActivity");
AndroidJavaObject ao = jc.CallStatic<AndroidJavaObject>("getInstance");
int sum = ao .Call<int>("myAdd",1,3);
如果不是立即返回的,则可以用
UnityPlayer.UnitySendMessage("GameObjectName", "CallBackFuncName", "param");
将结果返回给unity
将unity中关于编译Android程序的Jar包导入我们的项目中,
project - Properties - Java Build Path - Add External JARs...
Jar包路径一般为:
%Unity安装目录%\Editor\DataPlaybackEngines\androidplayer\development\bin\classes.jar
让Java的应用程序继承UnityPlayerNativeActivity,温馨提示:在Eclipes中自动import的快捷键为ctrl+shift+o,
基本秩序保留onCreate函数,然后就是写接口
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }一般接口分为两种,静态和非静态,
首先说一下静态函数接口的调用,假设我们的java类如下:
package com.Sealy.FingerTest;然后打包成jar包,放到unity工程中的Assets\Plugins\Android\bin目录下,注意,如果秩序打包java代码,则只需点击src打包
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;
import com.unity3d.player.UnityPlayer;
import com.Sealy.FingerTest.UnityPlayerNativeActivity;
public class MainActivity extends UnityPlayerNativeActivity{
public static int myAdd(int a,int b)
{
return a+b;
}
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }
}
在unity中,只需
private AndroidJavaClass jc;
jc = new AndroidJavaClass("com.Sealy.FingerTest.MainActivity");
int sum = jc.CallStatic<int>("myAdd",1,3);
搞定,这是最简单的调用类的静态方法,当然我们可以写成非静态方法,将java类写成单例,供外部调用,
package com.Sealy.FingerTest; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.graphics.Bitmap; import android.graphics.Canvas; import android.os.Bundle; import android.view.View; import com.unity3d.player.UnityPlayer; import com.Sealy.FingerTest.UnityPlayerNativeActivity; public class MainActivity extends UnityPlayerNativeActivity{ public static MainActivity currentActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); jarTestFunc("call onCreate"); currentActivity=this; } public static MainActivity getInstance() { return currentActivity; } public int myAdd(int a,int b) { return a+b; } }因为用了单例,单例的实例化在onCreate中,所以必须让类调用onCreate,所以需要在AndroidManifest.xml中配置相应的activity,
例子:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Sealy.FingerTest" android:theme="@android:style/Theme.NoTitleBar" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false"> <activity android:name="com.Sealy.FingerTest.MainActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> </manifest>然后把AndroidManifest.xml丢到unity的Assets\Plugins\Android目录下
然后unity调用如下:
private AndroidJavaClass jc;
jc = new AndroidJavaClass("com.Sealy.FingerTest.MainActivity");
AndroidJavaObject ao = jc.CallStatic<AndroidJavaObject>("getInstance");
int sum = ao .Call<int>("myAdd",1,3);
如果不是立即返回的,则可以用
UnityPlayer.UnitySendMessage("GameObjectName", "CallBackFuncName", "param");
将结果返回给unity
相关文章推荐
- unity csharp socket 异步通信 客户端
- Unity3D学习笔记——NGUI之UIToggle
- Unity 使用MiniJson解析本地数据
- Unity 4.x Asset Bundle 重名
- Unity添加自定义拓展方法ExternMethod
- 在Unity3D中加载外部图片的两种方法
- Unity 使用JsonFx解析本地json数据
- Unity协同程序(Coroutine)的解析
- Unity3d优化之从Draw Calls到GC
- Unity人工智能学习—确定性AI算法之追踪算法五
- untiy3d base64 To texture2d(unity3dbase64字符串数据转换图片)
- Unity人工智能学习—确定性AI算法之追踪算法四
- unity导出安卓APK后图片错乱的解决办法--getResources().getIdentifier()的使用
- TSSAO Temporal Screen-Space Ambient Occlusion (Unity3d 5 示例实现)
- TSSAO Temporal Screen-Space Ambient Occlusion (Unity3d 5 示例实现)
- 在Unity3D中实现简单的碰撞检测
- 使用Slua框架开发Unity项目的重要步骤
- 深入浅出聊Unity3D项目优化:从Draw Calls到GC
- 公布官方挑选的最佳用unity引擎开发的虚拟现实体验
- Unity Shader 表面着色器边缘光(Rim Lighting)二