gpt4 book ai didi

c# - 如何将 JNI C# 类传递给 Java 或处理这种情况?

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:16 25 4
gpt4 key购买 nike

我正在尝试从 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# 领域得到通知?

最佳答案

您可以在 VS201X 中通过引用将这些项目链接在一起。从这里开始,您应该能够填充其他层(JNI/Java),然后开始在系统周围传递您的指针(很长)并调用您的函数。

C#层

程序.cs

namespace CSharpLayer
{
class Program : CLILayer.CLIObject
{
static void Main(string[] args)
{
Program p = new Program();

p.invokeJava();
}

public void invokeJava()
{
//Call into CLI layer function to loadJVM, call Java code, etc
loadJava();
}

public override void callback(string data)
{
//This will be called from the CLI Layer.
}

}
}

C++/CLI 层 - DLL C++ 项目 w/CLR 支持(/clr)

CLI对象.h

#pragma once

namespace CLILayer
{
public ref class CLIObject
{
public:
CLIObject();
~CLIObject();

void loadJava(System::String^ jvm, System::String^ classpath);

virtual void callback(System::String^ data) = 0;
};
}

CLI对象.cpp

#include "CLIObject.h"
#include <string>

#include <msclr/marshal_cppstd.h>
#include <msclr/marshal.h>

using namespace msclr::interop;
using namespace CLILayer;

CLIObject::CLIObject()
{
}

CLIObject::~CLIObject()
{
}
CLIObject::loadJava(System::String^ jvmLocaion, System::String^ classpath)
{
std::string _jvmLoc = marshal_as<std::string>(jvmLocation);
std::string _classpath = marshal_as<std::string>(classpath);
}

关于c# - 如何将 JNI C# 类传递给 Java 或处理这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21951711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com