Dibangun di atas plugin DLR yang telah terbukti tersedia di platform Sinapse, JCOBridge menjamin kinerja terbaik dalam integrasi dunia JVM dan CLR.
- Ambil Tipe CLR
- Buat instance objek CLR
- Panggil metode statis
- Panggil metode instan
- Dapatkan/Atur properti statis
- Dapatkan/Atur properti instans
- Tetapkan Delegasi
- Berlangganan/Berhenti berlangganan acara
- Mengintegrasikan kontrol WPF ke jendela AWT/Swing
- Integrasikan kontrol WinForms ke jendela AWT/Swing
- Integrasikan objek antarmuka pengguna grafis .NET yang kompleks ke dalam jendela AWT/Swing
- Antarmuka pengguna Kontrol, properti, dan manajemen acara
- Ambil kelas JVM
- Buat instance objek JVM
- Panggil metode statis
- Panggil metode instan
- Dapatkan/Atur bidang statis
- Dapatkan/Setel bidang instans
- Gunakan akses dinamis untuk menulis kode dengan lancar seperti yang dilakukan dalam bahasa Java
- Gunakan antarmuka khusus untuk mengarahkan metode dan bidang pengelolaan
JCOBridge (JVM-CLR Object Bridge) memungkinkan eksekusi bahasa asli JVM, seperti java dan scala, dari bahasa CLR/.NET dan sebaliknya, memungkinkan untuk mengimpor dan menggunakan perpustakaan, komponen dan juga untuk mengelola antarmuka pengguna grafis dari satu dunia pemrograman ke dunia lain. Informasi lebih lanjut di www.jcobridge.com
Untuk mempelajari contoh, Anda perlu melakukan langkah-langkah berikut:
Dalam repositori ini dimungkinkan untuk menemukan contoh kode untuk berbagai bahasa pemrograman yang didukung oleh JCObridge. Contoh-contoh tersebut disusun dalam dua folder utama, JVM dan CLR yang berisi proyek relatif. Sebelum mengeksekusi kode, contoh kedua dunia perlu dikompilasi, karena tidak ada kompilasi runtime kode asing yang dilakukan, hanya eksekusi.
Proyek Cross Platform GUI menunjukkan cara menggunakan AWT untuk membuat antarmuka pengguna grafis lintas platform untuk .NET Core pada host Windows dan Linux. Untuk menggunakan Swing cukup ubah kontrol di dalam kode ke kontrol pilihan Anda.
Ini adalah contoh dasar di mana kita memanggil kelas sederhana yang didefinisikan dalam JavaClass.java dari aplikasi .NET. di /JVM/java/src/JavaClass.java kita memiliki kelas sederhana
public class JavaClass {
/**
* This simple method return the "Hello World!!" string
* * @return "Hello World!!" string
*/
public String helloWorld ()
{
return "Hello World from Java!!" ;
}
/**
* This simple method return the sum of two double
* @param a
* @param b
* @return a + b
*/
public double add ( double a , double b )
{
return a + b ;
}
/**
* This simple method return the sin of a double
* @param a
* @return sin of a
*/
public double sin ( double a )
{
return Math . sin ( a );
}
}
di CLRJavaClassUseExampleprogram.cs kita memiliki aplikasi .NET C# sederhana
using MASES . LicenseManager . Common ;
using MASES . JCBridge . C2JBridge ;
using System ;
namespace JavaClassUseExample
{
class Program
{
static void Main ( string [ ] args )
{
new TestClass ( ) . Execute ( ) ;
}
class TestClass : SetupJVMWrapper
{
public override string ClassPath { get { return @"....JVMOutput" ; } }
public void Execute ( )
{
double a = 2 ;
double b = 3 ;
double c = Math . PI / 2 ;
var javaClass = DynJVM . JavaClass . @new ( ) ;
string hello = javaClass . helloWorld ( ) ;
double result = javaClass . add ( a , b ) ;
double sin = javaClass . sin ( c ) ;
Console . WriteLine ( "{0} {1} + {2} = {3} and sin({4:0.0000000}) = {5:0.00000000}" , hello , a , b , result , c , sin ) ;
}
}
}
}
Mengeksekusi kode kita memiliki output berikut:
Hello World from Java!! 2 + 3 = 5 and sin(3,1415927) = 1,00000000
Contoh ini merupakan perpanjangan dari Contoh Penggunaan Kelas Java di mana parameter Lingkungan dikonfigurasi di kelas .NET TestClass .
class TestClass : SetupJVMWrapper
{
// the following line setup the classpath where JVM will search for classes
// during runtime it is possible to dynamically add other path using a call like DynJVM.JVMHelper.addPath(<the path to add>);
public override string ClassPath { get { return @"C:Program FilesMASES GroupJCOBCore;....JVMJavaOutput" ; } }
// uncomment the following line and set the correct JRE if the automatic search system fails
// public override string JVMPath { get { return @"C:Program FilesJavajre1.8.0_121binserverjvm.dll"; } }
// the following code adds all possible switch to the starting JVM.
// for a complete list see Oracle documentation: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
public override IEnumerable < KeyValuePair < string , string > > JVMOptions
{
get
{
var dict = new Dictionary < string , string > ( ) ;
dict . Add ( "-Xmx128M" , null ) ; // this line adds a complete argument
// dict.Add(property, value); // this line adds an argument like -Dproperty = value
return dict ;
}
}
// the following code adds initial packages to the import statement.
public override IEnumerable < string > JVMPackages
{
get
{
var list = new List < string > ( ) ;
list . Add ( "java.lang" ) ; // this line adds java.lang.* like you do with "import java.lang.*" in Java
return list ;
}
}
// uncomment and set the following line when you need features of JDK like the use of the compiler
// public override string JDKHome { get { return @"C:Program FilesJavajdk1.8.0_121"; } }
public void Execute ( )
{
double a = 2 ;
double b = 3 ;
double c = Math . PI / 2 ;
var javaClass = DynJVM . JavaClass . @new ( ) ;
string hello = javaClass . helloWorld ( ) ;
double result = javaClass . add ( a , b ) ;
double sin = javaClass . sin ( c ) ;
Console . WriteLine ( "{0} {1} + {2} = {3} and sin({4:0.0000000}) = {5:0.00000000}" , hello , a , b , result , c , sin ) ;
Console . WriteLine ( "Press Enter to exit" ) ;
Console . ReadLine ( ) ;
}
}
Ini adalah aplikasi yang lebih kompleks yang mengeksplorasi kemampuan JCOBridge melakukan operasi berikut: -Jalankan kode java di lingkungan .NET menggunakan pembungkus JVM Dinamis -Kelola objek bersama -Daftarkan objek CLR di sisi Mesin Virtual Java -Gunakan objek terdaftar dari sisi JVM -Panggil Metode pada kelas terdaftar JVM dan operasikan tercermin ke objek CLR -Buat dialog di sisi JVM dan gunakan dari kode .NET
Pustaka ini berisi satu kelas yang menyediakan operasi ganda dan string untuk dipanggil dari JVM.
Panel Formulir Windows dengan logika lengkapnya yang akan digunakan untuk mendemonstrasikan Integrasi Antarmuka Pengguna dalam aplikasi Java Grafis.
Panel WPF dengan logika lengkapnya yang akan digunakan untuk mendemonstrasikan Integrasi Antarmuka Pengguna dalam aplikasi Java Grafis.
Ini adalah contoh dasar di mana kita memanggil kelas sederhana yang didefinisikan dalam CSharpClass.cs dari aplikasi Java. di CLRCSharpClassCSharpClass.cs kita memiliki kelas sederhana
using System ;
namespace MASES . CLRTests
{
public class CSharpClass
{
/// <summary>The method <c>HelloWorld</c> return the "Hello World!!" string</summary>
public String HelloWorld ( )
{
return "Hello World from C#!!" ;
}
/// <summary>The method <c>Add</c> return the sum of two double</summary>
public double Add ( double a , double b )
{
return a + b ;
}
/// <summary>The method <c>Add</c> return the sin of a double</summary>
public double Sin ( double a )
{
return Math . Sin ( a ) ;
}
}
}
di /JVM/src/JavaClass.java kita memiliki aplikasi Java sederhana
import java . io . IOException ;
import org . mases . jcobridge .*;
public class CSharpClassUseExample {
public static void main ( String [] args ) {
try {
try {
try {
JCOBridge . Initialize ( "" );
} catch ( JCException e ) {
e . printStackTrace ();
}
} catch ( IOException e ) {
e . printStackTrace ();
}
//declare and create JCOBridge instance
JCOBridge bridge ;
bridge = JCOBridge . CreateNew ();
// adds the path where extarnal assemblies where found
bridge . AddPath ( "../CLR/Output/" );
// add REFERENCES to the .dll file
bridge . AddReference ( "CSharpClass" );
// GENERATE Object
JCObject CSharpObject = ( JCObject ) bridge . NewObject ( "MASES.CLRTests.CSharpClass" );
double a = 2 ;
double b = 3 ;
double c = Math . PI / 2 ;
//Invoke the C# class methods
String hello = ( String ) CSharpObject . Invoke ( "HelloWorld" );
double result = ( double ) CSharpObject . Invoke ( "Add" , a , b );
double sin = ( double ) CSharpObject . Invoke ( "Sin" , c );
System . out . println ( String . format ( "%s %.0f + %.0f = %.0f and sin(%.8f) = %.8f" , hello , a , b , result , c , sin ));
} catch ( JCException jce ) {
jce . printStackTrace ();
System . out . println ( "Exiting" );
return ;
}
}
}
Mengeksekusi kode kita memiliki output berikut:
Hello World from C#!! 2 + 3 = 5 and sin(3,14159265) = 1,00000000
Dalam contoh yang lebih kompleks ini kami mengintegrasikan ke dalam antarmuka pengguna awt java dua kontrol kompleks yang berbeda, diambil dari dua perpustakaan .NET. Kontrol pertama adalah Formulir Windows, yang kedua adalah objek WPF. Aplikasi di JVMJavasrcAWTWinFormsWPF.java memaparkan proses lengkap mulai dari referensi kontrol dan pembuatan hingga pendaftaran pendengar peristiwa .NET hingga manajemen panggilan balik peristiwa .NET.
import java . awt . Frame ;
import java . io . IOException ;
import org . mases . jcobridge .*;
public class AWTWinFormsWPF implements IJCVoidEventEmit {
public static void main ( String args []) {
new AWTWinFormsWPF (). createAndShow ();
}
int cycle = 0 ;
java . awt . TextArea gTextArea ;
// WPF
JCControl gControlWpfControl = null ;
// FORMS
JCControl gControlFormsControl = null ;
void createAndShow () {
try {
// LOGGER
IJCEventLog logger = null ;
try {
try {
JCOBridge . Initialize ( "" );
} catch ( JCException e ) {
e . printStackTrace ();
}
logger = new JCFileEventLog ( "WinFormsWPF.txt" );
} catch ( IOException e ) {
e . printStackTrace ();
}
JCOBridge bridge ;
bridge = JCOBridge . CreateNew ();
bridge . RegisterEventLog ( logger );
// adds the path where extarnal assemblies where found
bridge . AddPath ( "../../CLR/Output/" );
// add REFERENCES
bridge . AddReference ( "WPFTestControl" );
bridge . AddReference ( "WinFormsTestControl" );
// GENERATE CONTROLS
gControlWpfControl = bridge . GetControl ( "MASES.CLRTests.WPFTestControl.TestControl" );
gControlFormsControl = bridge . GetControl ( "MASES.CLRTests.WinFormsTestControl.TestControl" );
// CONFIGURE CONTROLS
gControlWpfControl . RegisterEventListener ( "FromComboBox" , this );
gControlWpfControl . RegisterEventListener ( "FromTextBox" , this );
gControlFormsControl . RegisterEventListener ( "FromComboBox" , this );
gControlFormsControl . RegisterEventListener ( "FromTextBox" , this );
Frame dialog = new Frame ();
gTextArea = new java . awt . TextArea ();
gTextArea . setText ( "This is an AWT TextArea" );
java . awt . GridLayout layout = new java . awt . GridLayout ( 2 , 2 );
dialog . setLayout ( layout );
dialog . add ( gControlWpfControl );
dialog . add ( gControlFormsControl );
dialog . add ( gTextArea );
dialog . validate ();
dialog . setTitle ( "WinForms-WPF AWT integration" );
dialog . setVisible ( true );
dialog . setSize ( 200 , 200 );
} catch ( JCException jce ) {
jce . printStackTrace ();
System . console (). readLine ( "Please press enter" );
System . out . println ( "Exiting" );
return ;
}
}
@ Override
public void EventRaised ( Object ... args ) {
System . out . println ( "EventRaised" );
if ( args [ 1 ] instanceof JCObject ) {
JCObject obj = ( JCObject ) args [ 1 ];
System . out . println ();
try {
if ( obj != null ) {
gTextArea . setText ( "Text area: event: " + obj . toString () + " Content: " + obj . Get ( "Content" ));
}
} catch ( JCException e ) {
e . printStackTrace ();
}
}
}
}
Kelas tunggal yang menyediakan operasi ganda dan string untuk dipanggil dari .NET CLR.
Kelas yang berisi dua metode dan menampilkan cara mendaftar dan menggunakan variabel dan objek global bersama
import org . mases . jcobridge .*;
import java . awt .*;
public class GlobalVariableTest
{
public static void createGlobal () throws JCException
{
Dialog dialog = new Dialog (( Dialog ) null );
JCOBridge . RegisterJVMGlobal ( "SharedDialog" , dialog );
}
public static void testMyCLRClass ( Integer a , Integer b ) throws JCException
{
JCObject resultGetCLRObject = ( JCObject ) JCOBridge . GetCLRGlobal ( "MyCLRClass" );
resultGetCLRObject . Invoke ( "Add" , a , b );
}
}
Metode createGlobal membuat dialog awt global dan mendaftarkannya untuk digunakan secara lancar dari sisi CLR. TestMyCLLRClass menunjukkan cara menggunakan objek global CLR yang terdaftar, dalam contoh CLR kami membuat objek ini dari sisi .NET dan kami memanggil fungsi ini untuk menggunakannya dan mendemonstrasikan operasi panas yang tercermin antara JVM dan CLR secara transparan.
Kelas Scala sederhana didefinisikan untuk digunakan dari CLR di JVMScalascalaclasssrcmainscalaScalaClass.class Panggil kompilasi dan jalankan skrip batch di JVMScala
Sebelum panggilan, kompilasi dan jalankan skrip batch, biner Scala harus diinstal.
import java . lang . _
final class ScalaClass ( aString : String , val anInteger : Int ) {
def this () {
this ( "defaultString" , - 1 )
}
def this ( aBool : Boolean ) {
this ( "defaultString" , - 1 )
}
val scalaString = "This is a Scala String"
def add ( x : Int , y : Int ): Int = x + y
def stringConcat ( args : Array [ String ]): String =
{
return args . mkString ( ", " )
}
}
Di CLRScalaClassUseExampleProgram.cs kami memiliki aplikasi sederhana yang menggunakan ScalaClass yang ditentukan
using CommonTest ;
using MASES . JCOBridge . C2JBridge ;
using MASES . LicenseManager . Common ;
using System ;
using System . IO ;
namespace ScalaClassUseExample
{
class TestClass : BaseTestClass
{
public override string GetProjectClassPath ( )
{
#if ! JCOBRIDGE_CORE
return @"....JVMScalaOutput" ;
#else
return @"......JVMScalaOutput" ;
#endif
}
public override string ClassPath
{
get
{
return new ClassPathBuilder ( GetProjectClassPath ( ) + @"*" , @"C:Program Files (x86)scalalib*.jar" ) . Build ( ) ;
}
}
public override void Execute ( )
{
int a = 10 ;
int b = 15 ;
var scalaClass = DynJVM . ScalaClass . @new ( ) ;
var result = scalaClass . add ( a , b ) ;
Console . WriteLine ( "{0} + {1} = {2}" , a , b , result ) ;
string [ ] strings = new string [ ] { "One" , "Two" , "Three" } ;
var concatString = scalaClass . stringConcat ( strings ) ;
Console . WriteLine ( "{0} = {1}" , string . Concat ( strings ) , concatString ) ;
Console . WriteLine ( "Press Enter to exit" ) ;
Console . ReadLine ( ) ;
}
}
class Program
{
static void Main ( string [ ] args )
{
try
{
new TestClass ( ) . Execute ( ) ;
}
catch ( Exception e )
{
Console . WriteLine ( e . Message ) ;
Console . WriteLine ( "Press any key." ) ;
Console . ReadKey ( ) ;
}
}
}
}
Di Scala, semua perpustakaan yang diperlukan harus ditambahkan secara eksplisit ke jalur dasar.
Dalam contoh ini kita memanggil objek .NET dari bahasa Scala melalui JCOBridge. Sebelum panggilan, kompilasi dan jalankan skrip batch, biner Scala harus diinstal.
import java . util . Iterator
import org . mases . jcobridge . _
object Main extends App {
try
{
JCOBridge . Initialize ();
}
catch
{
// catch to avoid problem with Trial mode of JCOBridge
case jce : JCException => System . out . println ( jce . getMessage )
}
val bridge = JCOBridge . CreateNew ()
// adds a new reference to WPF
bridge . AddReference ( "PresentationFramework" )
// get MessageBox type
val msgType = bridge . GetType ( "System.Windows.MessageBox" )
// invoke static method to show a message box on the screen
msgType . Invoke ( "Show" , "Please press enter to continue" )
// get .NET type
val enumType = bridge . GetType ( "System.Environment" )
// invokes static method
val genObj = enumType . Invoke ( "GetLogicalDrives" )
// retrieve the iterator
val iteratorObj = genObj . asInstanceOf [ JCObject ]. iterator
// iterate on all object and print the value
while ( iteratorObj . hasNext ) println ( iteratorObj . next )
// invoke static method to show a message box on the screen
msgType . Invoke ( "Show" , "Please press enter" )
// event callback example
val tObj = bridge . NewObject ( "System.Timers.Timer" ); // create the timer object
val timerObj = tObj . asInstanceOf [ JCObject ];
// register an event handler when the Timer elaps
timerObj . RegisterEventListener ( "Elapsed" , new ScalaJCVoidEventEmit ());
// set Interval property
timerObj . Set ( "Interval" , 1000 ); // set properties
// enable the Timer
timerObj . Set ( "Enabled" , true ); // start timer
// invoke static method to show a message box on the screen
msgType . Invoke ( "Show" , "Please press enter" )
}
final class ScalaJCVoidEventEmit () extends JCVoidEventEmit {
override def EventRaised ( args : Object *) : Unit =
{
// scala seems to have a problem to translate var args argument into JVM bytecode. This method is needed to avoid compilation problems
}
// this method defines exactly the signature expected from the event
def EventRaised ( sender : Object , arg : Object ) : Unit =
{
println ( "Timer Elapsed" )
}
}