Domanda

ho iniziato ad usare IKVM a tradurre librerie Java in .NET CIL. Posso scrivere con successo un programma C # che tira dentro (inproc) un Java tradotto assemblaggio da riferimento ed effettuare chiamate al codice Java tradotto.

La mia domanda è, è chiunque w familiare / come effettuare chiamate (callback) da Java a C # usando IKVM? Sono stato alla ricerca di un buon tutorial o spiegazione, ma non ho ancora visto uno.

Ogni aiuto è apprezzato. Grazie,

mj

È stato utile?

Soluzione

Signore e Signori, ho capito la mia domanda. Codice primo seguito da passi.

Java Class

public class TestClass {
private cli.CSharpLibrary.Library m_lib = null;

public void AddDelegate( cli.CSharpLibrary.Library lib )
{
    m_lib = lib;
}

public void FireDelegate()
{
    if( m_lib != null )
    {
        m_lib.ExecuteRunnableDelegate();
    }
}

public void PrintInt()
{
    System.out.print(23);
}
}

C # classe

using ikvm.runtime;
using CSharpLibrary;

namespace CSharp
{
  class Program
  {
public static void DelegateTarget()
{
  Console.WriteLine("DelegateTarget Executed!");
}

static void Main(string[] args)
{
  Library lib = new Library();
  lib.m_runnableDelegate = new Delegates.RunnableDelegate(DelegateTarget);

  TestClass tc = new TestClass();
  tc.AddDelegate(lib);
  tc.FireDelegate();

}
}
}

1) la vostra applicazione Java

2) Convertire i file vostro * .class in un file JAR (jar -cf myjar.jar * .class)

3) Convertire il file jar in un .NET assembly (ikvmc -Referenza: csharpassembly.dll myjar.jar)

Il lavoro dovrebbe a questo punto. È possibile eseguire il programma C #, lo avete chiamare il programma Java e viceversa convertito. Attenzione per la bandiera "-Referenza" sulla chiamata ikvmc. Questo dice IKVM quando è la conversione del codice Java che csharpassembly.dll ha alcune definizioni di classe che ha bisogno di attenzione.

Altri suggerimenti

JaapM, penso CSharpLibrary in soluzione di mj_ è una classe transitoria dalla terza C # progetto DLL (cshardassembly.dll), che lui compila prima e poi azioni tra java reale e codice C #. Non importa ciò che è in esso, l'idea è che entrambe le parti hanno un pezzo di codice (classe), noto in anticipo. Questo è eccessivo, se sono corrette.

Lo so, è un lungo periodo di tempo passato, ma vorrei inviare una breve soluzione qui che funziona per me, perchè ho sprecato troppo tempo su di esso e la documentazione IKVM è molto povero:

Java:

package what.ever.package;
import cli.System.Delegate;
import cli.System.Int32;
public class SomeJavaClass
{
    public static void setCallback(Delegate callback)
    {
        // I call delegate in static setter to keep example short, 
        // but you may save it and call later...
        Int32 result = (Int32)callback.DynamicInvoke("hello", "world");
        System.out.println("Callback returned [" + result + "]");
    }
}

Non dimenticare di convertire mscorlib.dll in vaso e collegarlo al vostro progetto Java per sostenere le importazioni CLI. costruire ed eseguire ikvmc.exe sul vaso con -target: parametro biblioteca e aggiungere conseguente DLL in C # progetto.

C #:

using what.ever.package
class Program
{
    // signature of delegate must match target function.
    public delegate Int32 TheDelegateItself(String a, String b);

    // callback that we pass into java.
    public static Int32 DelegateTarget(String a, String b)
    {
        Console.WriteLine("DelegateTarget Executed: [" + a + ", " + b + "]!");
        return 42;
    }

    static void Main(string[] args)
    {
        // again, static call to keep it short
        // but you may want a class instance in most cases.
        SomeJavaClass.setCallback(new TheDelegateItself(DelegateTarget));
    }
}

uscita:

  

DelegateTarget Eseguito:! [Ciao, mondo]
  Richiamata restituito [42]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top