2011-11-18 15 views
14

Los métodos C# no se pueden invocar directamente en Java utilizando JNI debido a diferentes motivos. Entonces primero tenemos que escribir un contenedor para C# usando C++, luego creamos el dll y lo usamos a través de JNI en Java.Llamando al método C# dentro de un programa Java

Tengo un problema al llamar al código C# en C++. Estoy agregando el archivo C# .netmodule a un proyecto C++. El código está pegado a continuación. Por favor, guíame si estoy haciendo algo mal.

Este es mi C++ administrado clase UsbSerialNum.h: es mi principal archivo de makeDLL.cpp a partir del cual se crea

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"); 
     } 
    } 
} 

Aquí makeDLL.dll:

#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(); 
     } 
}; 

archivo C# UsbSerialNumberCSharp.cs de la que he creado el archivo .netmodule :

#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(); 
} 

Aquí es mi clase 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:

si simplemente ignorar la llamada a UsbSerial.h en mi archivo principal de esto es simple uso de C++ entonces mi código está trabajando muy bien en Java. Básicamente, la clase administrada de C++ no funciona correctamente. Por favor, guíame. Gracias.

+0

en cuyo caso, ¿recibe el error? – Illuminati

+0

¿Cuál es el problema? ¿Es esto administrado C++? No reconozco los bits '__gc' – flipchart

+0

que he editado la pregunta. Por favor, míralo. Gracias. – HashimR

Respuesta

7

Sería útil saber exactamente para qué necesita esta interoperabilidad. En cualquier caso, debe consultar IKVM; alternativamente puede (como se ha sugerido para un problema similar) usar COM como un puente: exponer el C#/CLR como una interfaz COM y luego usar com4j en Java.

+0

Quiero obtener el número de serie de todos los USB conectados, ya he escrito el código en C#, quiero usarlo en Java. – HashimR

Cuestiones relacionadas