Вызов метода С# в программе Java

Методы С# не могут быть вызваны непосредственно на Java с использованием JNI по разным причинам. Итак, сначала мы должны написать обертку для С# с использованием С++, затем создать DLL и использовать ее через JNI в Java.

У меня проблема с вызовом кода С# в С++. Я добавляю файл С# .netmodule в проект С++. Код вставлен ниже. Пожалуйста, направляйте меня, если я что-то делаю неправильно.

Это мой управляемый класс С++ UsbSerialNum.h:

#using <mscorlib.dll>
#include <iostream>
#using "UsbSerialNumberCSharp.netmodule"

using namespace std;

using namespace System;

public __gc class UsbSerialNum
{
    public:

        UsbSerialNumberCSharp::UsbSerialNumberCSharp __gc *t;

        UsbSerialNum() {
            cout<<"Hello from C++";
            t = new UsbSerialNumberCSharp::UsbSerialNumberCSharp();
        }

        void CallUsbSerialNumberCSharpHello() {
            t->hello();
        }
};

С# UsbSerialNumberCSharp.cs файл, из которого я создал файл .netmodule:

using System.Collections.Generic;
using System.Text;

namespace UsbSerialNumberCSharp
{
    public class UsbSerialNumberCSharp
    {

        public UsbSerialNumberCSharp(){
            Console.WriteLine("hello");
        }

        public static void hello()
        {
            Console.WriteLine("hello");
        }

        public void helloCSharp ()
        {
            Console.WriteLine("helloCSharp");
        }
    }
}

Вот мой основной файл makeDLL.cpp, из которого создан makeDLL.dll:

#include "jni.h"
#include <iostream>


// This is the java header created using the javah -jni command.
#include "testDLL.h"


// This is the Managed C++ header that contains the call to the C#
#include "UsbSerialNum.h"

using namespace std;


JNIEXPORT void JNICALL Java_testDLL_hello
(JNIEnv *, jobject) {

    // Instantiate the MC++ class.
    UsbSerialNum* serial = new UsbSerialNum();
    serial->CallUsbSerialNumberCSharpHello();
}

Вот мой класс java:

public class testDLL {

    static {
        System.loadLibrary("makeDLL");
    }

    /**
     * @param args
     */
    public static void main (String[] args) {
        //        new testDLL().GetUSBDevices("SCR3", 100);
        new testDLL().hello();
    }

    public native void hello();

}

EDIT:

Если я просто игнорирую вызов UsbSerial.h в моем основном файле, то я использую простой С++, тогда мой код отлично работает на Java. В основном управляемый класс С++ работает неправильно. Пожалуйста, направляйте меня. Спасибо.

Ответы

Ответ 1

Было бы полезно узнать, для чего вам нужна эта интероперабельность. В любом случае вы должны изучить IKVM; альтернативно вы можете (как было предложено для аналогичной проблемы) использовать COM в качестве моста: выставить С#/CLR в качестве COM-интерфейса, а затем использовать com4j в Java.