10人参与 • 2025-04-24 • C#
ikvmc
、ikvm
等工具),需要 jdk 和 .net framework。javac
、javah
)和 .net 的 p/invoke 支持。example.jar
)。原理:将 java 字节码转换为 .net 程序集(dll),直接在 c# 中引用。
ikvmc -target:library example.jar -out:example.dll
using ikvm.runtime; using java.example; // 对应 java 包名 public class program { public static void main() { // 调用 java 类 exampleclass obj = new exampleclass(); obj.examplemethod("hello from c#"); } }
public
的。原理:通过 jni 调用 java 虚拟机(jvm),c# 通过 p/invoke 调用 jni 接口。
public class nativebridge { public static native void callfromcsharp(string message); }
javac nativebridge.java javah -jni nativebridge
nativebridge.h
。#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); }
gcc -shared -i"%java_home%\include" -i"%java_home%\include\win32" nativebridge.c -o nativebridge.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"); } }
jni_createjavavm
)。-reference:other.jar
。releasestringutfchars
释放资源。path
环境变量中。var classloader = new ikvm.runtime.assemblyclassloader(typeof(program).assembly); var clazz = classloader.loadclass("java.example.dynamicclass");
nativelib.dll
)及其函数签名。原理:通过 jna 库直接映射 dll 函数到 java 接口,无需编写 c 代码。
<!-- maven --> <dependency> <groupid>net.java.dev.jna</groupid> <artifactid>jna</artifactid> <version>5.13.0</version> </dependency>
import com.sun.jna.library; import com.sun.jna.native; public interface nativelib extends library { nativelib instance = native.load("nativelib", nativelib.class); // 映射 dll 函数 void examplefunction(string message); int addnumbers(int a, int b); }
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); } }
structure
类。回调函数:
public interface callbacklib extends library { interface callback extends callbackproxy { void invoke(string result); } void registercallback(callback callback); }
结构体映射:
public class point extends structure { public int x; public int y; }
native.getnativesize()
调试类型大小。以上就是c#和java互相调用的方法小结的详细内容,更多关于c#和java互相调用的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论