165人参与 • 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 举报,一经查实将立刻删除。
发表评论