我试图从C#调用Java方法,而从Java调用它是这样的:
EgamePay.pay(thisActivity, payAlias, new EgamePayListener() {
@Override
public void paySuccess(String alias) {
}
@Override
public void payFailed(String alias, int errorInt) {
}
@Override
public void payCancel(String alias) {
}
});
前两个参数都可以,但是如何在C#中传递EgamePayListner?简单地创建具有相同功能的C#类是行不通的...
这是我目前正在做的事情:
using (AndroidJavaClass jc = new AndroidJavaClass("cn.egame.terminal.smspay.EgamePay"))
{
System.IntPtr cls_Activity = AndroidJNI.FindClass("com/unity3d/player/UnityPlayer");
System.IntPtr fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity, "currentActivity", "Landroid/app/Activity;");
object[] p = { fid_Activity, "payAlias", new EgamePayListener() };
jc.CallStatic("pay", p);
}
..
class EgamePayListener
{
public void paySucess(string alias)
{
}
public void payFailed(string alians, int errorInt)
{
}
public void payCancel(string alias)
{
}
}
显然那是错误的,我该如何处理这种情况,以便在这些函数被触发时可以在C#领域得到通知?
如果您在Unity3D的上下文中,则从Java本机代码与Unity3D C#脚本进行交互的更好方法是调用该UnitySendMessage
方法。您可以在Java代码中调用此方法,并且一条消息将发送到C#,因此您可以获得在C#中执行的指定方法。
您可以在Unity场景中添加一个gameObject并创建一个MonoBehavior脚本,其中包含这三种方法(paySucess(字符串消息),payFailed(字符串消息)和payCancel(消息))。然后,新创建的脚本附加到游戏对象(让我们假设这个游戏物体的名称为“PayListener”),并确保在场景中现有的Java代码的时候要执行的游戏对象(你可以调用DontDestroyOnLoad
的游戏对象中Awake
,例如)。
然后,在您的Java代码中,只需编写如下代码:
EgamePay.pay(thisActivity, payAlias, new EgamePayListener() {
@Override
public void paySuccess(String alias) {
com.unity3d.player.UnityPlayer.UnitySendMessage("PayListener","paySuccess", alias);
}
@Override
public void payFailed(String alias, int errorInt) {
com.unity3d.player.UnityPlayer.UnitySendMessage("PayListener","payFailed", alias + "#" + errorInt);
}
@Override
public void payCancel(String alias) {
com.unity3d.player.UnityPlayer.UnitySendMessage("PayListener","payCancel", alias);
}
});
如果没有com.unity3d.player.UnityPlayer
该类,它将阻止Java文件成功构建。您可以找到/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/bin/classes.jar
文件并将其添加为Java项目的依赖库。然后,您可以正确生成,生成和使用新的jar文件。
由于该UnitySendMessage
方法只能接受1个参数,因此您可能必须payFailed
通过策略将结果别名和errorInt连接起来,然后在Unity C#端将其解析回去。
通过使用新构建的jar文件并将其加载为AndroidJavaClass
或AndroidJavaObject
,当调用Java中的一个时,应该调用PayListener脚本中的相应方法。
对于Android插件与UnitySendMessage的文档,你可以参观如何实现一个Android的JNI插件的官方指南这里,在具体例3。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句