欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#和Java互相調(diào)用的方法小結(jié)

 更新時間:2025年04月02日 09:34:42   作者:老胖閑聊  
這篇文章主要介紹了C#和Java互相調(diào)用的方法,文中展示了如何在不同編程語言之間實(shí)現(xiàn)互操作,每種語言之間的互操作都有其特定的方法和工具,希望這些示例能夠幫助你更好地理解和實(shí)現(xiàn)跨語言調(diào)用,需要的朋友可以參考下

C# 調(diào)用 Java 類和方法(IKVM / JNI-JNA 橋接)

一、前置條件

  1. 環(huán)境要求
    • IKVM:安裝 IKVM 工具包(包含 ikvmcikvm 等工具),需要 JDK 和 .NET Framework。
    • JNI/JNA:需要 Java JDK(包含 javacjavah)和 .NET 的 P/Invoke 支持。
  2. 文件準(zhǔn)備
    • Java JAR 包(如 example.jar)。
    • Java 類的完整定義(需公開目標(biāo)類和方法)。

二、方法 1:使用 IKVM 橋接

原理:將 Java 字節(jié)碼轉(zhuǎn)換為 .NET 程序集(DLL),直接在 C# 中引用。

實(shí)現(xiàn)步驟:

  • 安裝 IKVM
  • 轉(zhuǎn)換 JAR 到 .NET DLL
ikvmc -target:library example.jar -out:Example.dll
  • 在 C# 中引用 DLL
using IKVM.Runtime;
using java.example; // 對應(yīng) Java 包名

public class Program {
    public static void Main() {
        // 調(diào)用 Java 類
        ExampleClass obj = new ExampleClass();
        obj.exampleMethod("Hello from C#");
    }
}

注意事項(xiàng):

  • 確保 Java 類和方法是 public 的。
  • 轉(zhuǎn)換過程中可能丟失部分 Java 特性(如動態(tài)代理)。

三、方法 2:使用 JNI/JNA 橋接

原理:通過 JNI 調(diào)用 Java 虛擬機(jī)(JVM),C# 通過 P/Invoke 調(diào)用 JNI 接口。

實(shí)現(xiàn)步驟:

  • 編寫 Java 本地接口(JNI)
public class NativeBridge {
    public static native void callFromCSharp(String message);
}
  • 生成 C/C++ 頭文件
javac NativeBridge.java
javah -jni NativeBridge
  • 生成 NativeBridge.h。
  • 實(shí)現(xiàn) C/C++ 橋接層
#include <jni.h>
#include "NativeBridge.h"

JNIEXPORT void JNICALL Java_NativeBridge_callFromCSharp(JNIEnv *env, jclass cls, jstring msg) {
    const char *cMsg = env->GetStringUTFChars(msg, 0);
    printf("Java received: %s\n", cMsg);
    env->ReleaseStringUTFChars(msg, cMsg);
}
  • 編譯為 DLL
gcc -shared -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" NativeBridge.c -o NativeBridge.dll
  • C# 調(diào)用 DLL
using System;
using System.Runtime.InteropServices;

public class Program {
    [DllImport("NativeBridge.dll")]
    private static extern void Java_NativeBridge_callFromCSharp(string message);

    public static void Main() {
        Java_NativeBridge_callFromCSharp("Hello via JNI");
    }
}

注意事項(xiàng):

  • 需要手動管理 JVM 生命周期(JNI_CreateJavaVM)。
  • 跨平臺需重新編譯 DLL/SO。

四、常見問題

  1. IKVM 轉(zhuǎn)換失敗
    • 缺少依賴 JAR 包時,需添加 -reference:other.jar
  2. JNI 內(nèi)存泄漏
    • 使用 ReleaseStringUTFChars 釋放資源。
  3. DLL 路徑問題
    • 確保 DLL 在輸出目錄或 PATH 環(huán)境變量中。

五、高級特性

  1. IKVM 動態(tài)類加載
var classLoader = new ikvm.runtime.AssemblyClassLoader(typeof(Program).Assembly);
var clazz = classLoader.loadClass("java.example.DynamicClass");
  • JNI 回調(diào) C# 方法
    • 在 C/C++ 層定義回調(diào)函數(shù),通過 P/Invoke 調(diào)用 C# 委托。

Java 調(diào)用 DLL 的類和方法(JNA)

一、前置條件

  1. 環(huán)境要求
    • Java 8+,安裝 JNA 庫。
  2. 文件準(zhǔn)備
    • 目標(biāo) DLL(如 NativeLib.dll)及其函數(shù)簽名。

二、使用 JNA 方法

原理:通過 JNA 庫直接映射 DLL 函數(shù)到 Java 接口,無需編寫 C 代碼。

實(shí)現(xiàn)步驟:

  1. 添加 JNA 依賴
<!-- Maven -->
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>
  • 定義 Java 接口
import com.sun.jna.Library;
import com.sun.jna.Native;

public interface NativeLib extends Library {
    NativeLib INSTANCE = Native.load("NativeLib", NativeLib.class);
    
    // 映射 DLL 函數(shù)
    void exampleFunction(String message);
    int addNumbers(int a, int b);
}
  • 調(diào)用 DLL 函數(shù)
public class Main {
    public static void main(String[] args) {
        NativeLib.INSTANCE.exampleFunction("Hello from Java");
        int sum = NativeLib.INSTANCE.addNumbers(3, 4);
        System.out.println("Sum: " + sum);
    }
}

注意事項(xiàng):

  • 函數(shù)名和參數(shù)類型需與 DLL 嚴(yán)格匹配。
  • 支持復(fù)雜類型(結(jié)構(gòu)體、指針)需使用 Structure 類。

三、高級特性

回調(diào)函數(shù)

public interface CallbackLib extends Library {
    interface Callback extends CallbackProxy {
        void invoke(String result);
    }
    void registerCallback(Callback callback);
}

結(jié)構(gòu)體映射

public class Point extends Structure {
    public int x;
    public int y;
}

四、常見問題

  1. UnsatisfiedLinkError
    • 檢查 DLL 名稱和路徑,確保 32/64 位一致。
  2. 參數(shù)類型不匹配
    • 使用 Native.getNativeSize() 調(diào)試類型大小。

總結(jié)

  • C# 調(diào)用 Java:優(yōu)先使用 IKVM 簡單場景,JNI 用于高性能需求。
  • Java 調(diào)用 DLL:JNA 是最簡方案,無需編寫 C 代碼。
  • 代碼可維護(hù)性:跨語言調(diào)用需詳細(xì)文檔記錄接口約定。

以上就是C#和Java互相調(diào)用的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C#和Java互相調(diào)用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#識別出圖片里的數(shù)字和字母

    C#識別出圖片里的數(shù)字和字母

    本文給大家分享的是C#識別出圖片里的數(shù)字和字母的代碼,主要是識別以前公司的軟件注冊碼截圖里的數(shù)字和字母,功能很簡單,也存在很大的局限性,這里僅僅是分享,小伙伴們參考下。
    2015-03-03
  • C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn)

    C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn)

    本文主要介紹了C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C# 并行和多線程編程——Task進(jìn)階知識

    C# 并行和多線程編程——Task進(jìn)階知識

    這篇文章主要介紹了C# 并行和多線程編程——Task進(jìn)階知識的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#排序算法之快速排序

    C#排序算法之快速排序

    下面給出的代碼是以數(shù)組最后一個元素作為參考元素,這僅是參考元素選取的方式之一。
    2010-09-09
  • C#實(shí)現(xiàn)無損壓縮圖片代碼示例

    C#實(shí)現(xiàn)無損壓縮圖片代碼示例

    這篇文章介紹了C#實(shí)現(xiàn)無損壓縮圖片的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 使用?CliWrap?讓C#中的命令行交互(推薦)

    使用?CliWrap?讓C#中的命令行交互(推薦)

    這篇文章主要介紹了使用?CliWrap?讓C#中的命令行交互舉重若輕,這是一個在?.NET?平臺使用的命令行交互工具庫,?通過在C#?中使用?Fluent?的API,?讓命令行交互,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • C# DateTime日期比較方法案例詳解

    C# DateTime日期比較方法案例詳解

    這篇文章主要介紹了C# DateTime日期比較方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Unity相機(jī)移動之屏幕邊緣檢測

    Unity相機(jī)移動之屏幕邊緣檢測

    這篇文章主要為大家詳細(xì)介紹了Unity相機(jī)移動之屏幕邊緣檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 基于C#實(shí)現(xiàn)亂碼視頻效果

    基于C#實(shí)現(xiàn)亂碼視頻效果

    亂碼視頻效果可能很多人都在抖音看到過,即把一個短視頻,轉(zhuǎn)成數(shù)字、字母等亂碼組成的形式進(jìn)行播放。本文將用C#實(shí)現(xiàn)一下這一效果,感興趣的可以了解一下
    2023-01-01
  • C#實(shí)現(xiàn)讀寫CSV文件的方法詳解

    C#實(shí)現(xiàn)讀寫CSV文件的方法詳解

    項(xiàng)目中經(jīng)常遇到CSV文件的讀寫需求,其中的難點(diǎn)主要是CSV文件的解析。本文會介紹CsvHelper、TextFieldParser、正則表達(dá)式三種解析CSV文件的方法,需要的可以參考一下
    2022-06-06

最新評論