Вызов метода C # в программе Java - PullRequest
14 голосов
/ 18 ноября 2011

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

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

Это мой управляемый класс C ++ 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();
        }
};

C # 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 в моем основном файле, то есть использую простой C ++, тогда мой код работает нормально на Java. В основном управляемый класс C ++ не работает должным образом. Пожалуйста, ведите меня. Спасибо.

Ответы [ 2 ]

7 голосов
/ 18 ноября 2011

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

0 голосов
/ 28 ноября 2011

Вы можете избежать C # и все еще можете запрашивать WMI, используя только C ++. См. Использование WMI для вызова метода на объектах

...