1. 程式人生 > >Java呼叫C#類庫

Java呼叫C#類庫

原帖地址:https://bbs.csdn.net/topics/390624108

 

總體分三步走:

  1. 準備一個 C# 類庫 (dll)
  2. 編寫一個java 類
  3. 編譯 java 類並打包成jar,即可執行




第一步,我的 C#類庫程式碼
Calc.cs 程式碼如下:
 

using System;
namespace MyCSharpDemoCalc
{
   public interface ICalc
   {
       int MySuperSmartFunctionIDontHaveInJava(int mi);
       string PrintPatientInfo(patient aPatient);
   }


   public class DemoCalc : ICalc
   {
       private readonly Random r = new Random();
       private patient Patient;
       public DemoCalc(patient aPatient)
       {
           Patient = new patient();
           Patient.ID = aPatient.ID;
           Patient.FirstName = aPatient.FirstName;
           Patient.Sex = aPatient.Sex;
       }

       public int  MySuperSmartFunctionIDontHaveInJava(int mi)
       {
           return mi + r.Next();
       }
       public string PrintPatientInfo(patient aPatient)
       {
          return aPatient.ID.ToString() + " - " + aPatient.FirstName + " - " + aPatient.Sex.ToString();
       }
   }
}


patient.cs 程式碼如下:
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyCSharpDemoCalc
{
   public class patient
   {
       private int id;
       private string firstname;
       private bool sex;
       public int ID
       {
           get { return id; }
           set { id = value; }
       }
       public string FirstName
       {
           get { return firstname; }
           set { firstname = value; }
       }
       public bool Sex
       {
           get { return sex; }
           set { sex = value; }
       }
   }
}


編譯成一個 C# 的 dll比如 MyCSharpDemoCalc.dll 即可,FrameWork用什麼版本都可以

第二步、編寫一個java 類,程式碼如下:

MyCalcUsageInJava.java 
 

import net.sf.jni4net.Bridge;
import java.io.IOException;
import mycsharpdemocalc.DemoCalc;
import mycsharpdemocalc.ICalc;
import mycsharpdemocalc.patient;

public class MyCalcUsageInJava {
   public static void main(String arsg[]) throws IOException {
       Bridge.init();
//載入 C# 類庫
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("MyCSharpDemoCalc.j4n.dll"));
//例項化 C# 類庫中的類 patient
patient Patient = new patient();

Patient.setID(1);
Patient.setFirstName("張三");
Patient.setSex(true);
//例項化 C# 類庫中的類 DemoCalc
       ICalc calc = new DemoCalc(Patient);
//呼叫 C# 類庫中 DemoCalc 類的方法MySuperSmartFunctionIDontHaveInJava
       final int result = calc.MySuperSmartFunctionIDontHaveInJava(123);
       System.out.printf("執行結果 : " + result + "\r\n");
//呼叫 C# 類庫中 DemoCalc 類的方法PrintPatientInfo  
       final String result1 = calc.PrintPatientInfo(Patient);
       System.out.printf("執行結果 : " + result1);

   }
}



第三步、編譯我的java檔案 MyCalcUsageInJava.java 
分幾小步
A)下載 jni4net http://sourceforge.net/projects/jni4net/?source=dlp 解壓
B)在解壓目錄下建立sample目錄
C)在 sample目錄 中 建立 mycalc目錄
D)在 sample目錄 中 建立 work 子目錄 將 jni4net lib目錄中的 jni4net.n.w32.v20-0.8.6.0.dll、jni4net.j-0.8.6.0.jar、jni4net.n.w32.v40-0.8.6.0.dll、jni4net.n.w64.v20-0.8.6.0.dll、jni4net.n.w64.v40-0.8.6.0.dll、jni4net.n-0.8.6.0.dll 拷貝進來
E) 將編譯好的 C# 類庫 MyCSharpDemoCalc.dll 也拷貝到上面的 work子目錄中
F)在 work目錄中建立 build.cmd
 

@echo off
if not exist target mkdir target
if not exist target\classes mkdir target\classes
echo compile classes
javac -nowarn -d target\classes -sourcepath jvm -cp "e:\javacallc#\jni4net-0.8.6.0-bin\lib\jni4net.j-0.8.6.0.jar"; "jvm\mycsharpdemocalc\ICalc.java" "jvm\mycsharpdemocalc\ICalc_.java" "jvm\mycsharpdemocalc\DemoCalc.java" "jvm\mycsharpdemocalc\patient.java" 
IF %ERRORLEVEL% NEQ 0 goto end
echo MyCSharpDemoCalc.j4n.jar 
jar cvf MyCSharpDemoCalc.j4n.jar  -C target\classes "mycsharpdemocalc\ICalc.class"  -C target\classes "mycsharpdemocalc\ICalc_.class"  -C target\classes "mycsharpdemocalc\__ICalc.class"  -C target\classes "mycsharpdemocalc\DemoCalc.class"  -C target\classes "mycsharpdemocalc\patient.class"  > nul 

IF %ERRORLEVEL% NEQ 0 goto end
echo MyCSharpDemoCalc.j4n.dll 
csc /nologo /warn:0 /t:library /out:MyCSharpDemoCalc.j4n.dll /recurse:clr\*.cs  /reference:"E:\javaCallC#\jni4net-0.8.6.0-bin\samples\myCSharpDemoCalc\work2\MyCSharpDemoCalc.dll" /reference:"E:\javaCallC#\jni4net-0.8.6.0-bin\lib\jni4net.n-0.8.6.0.dll"

IF %ERRORLEVEL% NEQ 0 goto end
:end




G)在mycalc目錄中建一個 java ant 編譯指令碼  build.bat

@echo off
copy ..\..\lib\*.* work

..\..\bin\proxygen.exe work\MyCSharpDemoCalc.dll -wd work2
cd work
call build.cmd
cd ..
echo compiling usage
javac -d work\ -cp work\jni4net.j-0.8.6.0.jar;work\MyCSharpDemoCalc.j4n.jar MyCalcUsageInJava.java



G)在cmd dos視窗中執行 mycalc目錄 中的 build.bat即可進行編譯l了,編譯效果:


H)執行編譯好的 jar包看看效果:
cd work
java -cp jni4net.j-0.8.6.0.jar;MyCSharpDemoCalc.j4n.jar;. MyCalcUsageInJava




今後只需要更新 C# dll即可,java程式碼無需重新編譯,簡單吧,很爽吧!

更多詳情:http://kan.weibo.com/con/3636924272047381

有任何疑問歡迎隨時找我交流。