阅读量:90
在Java中调用C#代码并处理回调,可以通过以下几种方式实现:
-
使用Java Native Interface (JNI): 通过JNI,你可以在Java代码中调用C#方法。首先,你需要在C#中创建一个Java Native Interface (JNI) 类,然后在Java代码中加载这个类并调用相应的方法。
C# 示例:
using System; using System.Runtime.InteropServices; public class JniWrapper { [DllImport("kernel32.dll")] public static extern void Java_com_example_myapp_MyClass_nativeCallback(string message); public static void CallNativeCallback(string message) { nativeCallback(message); } }Java 示例:
public class MyClass { static { System.loadLibrary("jniwrapper"); } public native void nativeCallback(String message); public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.nativeCallback("Hello from Java!"); } } -
使用Web API或REST服务: 如果你有一个C#后端服务,你可以创建一个Web API或REST服务,让Java客户端通过HTTP请求与C#后端进行通信。这种方法不需要在Java和C#之间直接调用,而是通过网络协议进行通信。
C# 示例(ASP.NET Core):
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class MyController : ControllerBase { [HttpPost] public async TaskHandleRequest([FromBody] string message) { // 处理请求并调用回调方法 await Task.Delay(1000); Console.WriteLine("Received message: " + message); return Ok(); } }Java 示例:
import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public class MyClient { public static void main(String[] args) { try { URL url = new URL("http://localhost:5000/api/my"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/json; utf-8"); String input = "{\"message\":\"Hello from Java!\"}"; byte[] inputBytes = input.getBytes("utf-8"); connection.setFixedLengthStreamingMode(inputBytes.length); try (OutputStream os = connection.getOutputStream()) { os.write(inputBytes); } int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); } catch (IOException e) { e.printStackTrace(); } } } -
使用gRPC: gRPC是一个高性能、开源的通用RPC框架,可以在Java和C#之间进行通信。首先,你需要定义一个
.proto文件,然后使用gRPC工具生成Java和C#客户端和服务端代码。示例
.proto文件:syntax = "proto3"; package mygrpc; service MyService { rpc CallMyMethod (MyRequest) returns (MyResponse); } message MyRequest { string message = 1; } message MyResponse { string result = 1; }C# 示例(服务器端):
using System; using System.Threading.Tasks; using Grpc.Core; public class MyService : MyService.MyServiceBase { public override TaskCallMyMethod(MyRequest request, ServerCallContext context) { // 处理请求并调用回调方法 Console.WriteLine("Received message: " + request.Message); return Task.FromResult(new MyResponse { Result = "Hello from C#" }); } }Java 示例(客户端):
import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import mygrpc.MyServiceGrpc; import mygrpc.MyServiceOuterClass; public class MyClient { public static void main(String[] args) throws Exception { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build(); MyServiceGrpc.MyServiceClient client = MyServiceGrpc.newClient(channel); MyServiceOuterClass.MyRequest request = MyServiceOuterClass.MyRequest.newBuilder().setMessage("Hello from Java!").build(); MyServiceOuterClass.MyResponse response = client.callMyMethod(request); System.out.println("Response: " + response.getResult()); channel.shutdown(); } }
这些方法都可以实现Java调用C#并处理回调的功能,你可以根据具体需求选择合适的方式。