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

标签 c# java java-native-interface unity3d

我正在尝试从 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/

相关文章:

c# - 如何用\"修复JSON?

c# - "Incorrect syntax near ' = '"运行时错误 c# asp.net

c# - 调用设计模式的方法

java - DynamicReports 不在页面开始处打印列标题

android - 使用 NDK 在 pthread 中调用 java 函数

java - JNI 错误 : attempt to pass an instance of java. lang.String 作为参数

c# - WPF 使用控件附加弹出窗口

java - .xsd 不是此编译的一部分。这是 .xjb 的错误吗

java - TLSv1.3 - 现在在 Java 8 中可用吗?

java - JNI - java ArrayList 转换为 c++ std::string*