gpt4 book ai didi

c# - 从 Java 调用 .NET 程序集 : JVM crashes

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:40 26 4
gpt4 key购买 nike

我有一个第三方 .NET 程序集和一个大型 Java 应用程序。我需要从 Java 应用程序调用 .NET 类库提供的方法。该程序集未启用 COM。我已经在网上搜索过,到目前为止我有以下内容:

C#代码(cslib.cs):

using System;

namespace CSLib
{
public class CSClass
{
public static void SayHi()
{
System.Console.WriteLine("Hi");
}
}
}

编译(使用 .net 3.5,但使用 2.0 时也是如此):

csc /target:library cslib.cs

C++代码(clib.cpp):

#include <jni.h>
#using <CSLib.dll>

using namespace CSLib;

extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
CSLib::CSClass::SayHi();
}

编译用(使用VC 2008工具,但使用2003工具时也是如此):

cl /clr /LD clib.cpp
mt -manifest clib.dll.manifest -outputresource:clib.dll;2

Java代码(CallCS.java):

class CallCS {
static {
System.loadLibrary("clib");
}
private static native void callCS();
public static void main(String[] args) {
callCS();
}
}

当我尝试运行 java 类时,Java VM 在调用方法时崩溃(它能够加载库):

## An unexpected error has been detected by Java Runtime Environment:##  Internal Error (0xe0434f4d), pid=3144, tid=3484## Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)# Problematic frame:# C  [kernel32.dll+0x22366]#...Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)j  CallCS.callCS()V+0j  CallCS.main([Ljava/lang/String;)V+0v  ~StubRoutines::call_stub

However, if I create a plain cpp application that loads clib.dll and calls the exported function Java_CallCS_callCS, everything is OK. I have tried this on both x86 and x64 environments and the result is the same. I have not tried other versions of Java, but I need the code to run on 1.5.0.

Moreover, if I modify clib.cpp to call only System methods everything works fine even from Java:

#include <jni.h>
#using <mscorlib.dll>

using namespace System;

extern "C" _declspec(dllexport) void Java_CallCS_callCS(JNIEnv* env, jclass cls) {
System::Console::WriteLine("It works");
}

总结:

  1. 我能够从 Java -> clib.dll -> mscorlib.dll 调用系统方法
  2. 我能够从 CPPApp -> clib.dll -> cslib.dll 调用任何方法
  3. 我无法从 Java -> clib.dll -> cslib.dll 调用任何方法

我知道使用上述 1. 的解决方法 - 我可以使用反射来加载组件并仅使用系统调用来调用所需的方法,但代码变得困惑,我希望有更好的解决方案。

我知道 dotnetfromjava 项目,它使用反射方法,但不希望增加不必要的复杂性。但是,如果没有其他方法,我将使用类似的东西。

我也看过 ikvm.net,但我的理解是它使用自己的 JVM(用 C# 编写)来实现这一魔法。但是,在其 VM 下运行整个 Java 应用程序对我来说不是一个选择。

谢谢。

最佳答案

OK,谜底揭晓。

JVM 崩溃是由未处理的 System.IO.FileNotFoundException 引起的。抛出异常是因为在调用 exe 文件所在的文件夹中搜索 .NET 程序集。

  1. mscorlib.dll 位于全局程序集缓存中,因此可以正常工作。
  2. CPP 应用程序 exe 与程序集位于同一文件夹中,因此它也可以工作。
  3. cslib.dll 程序集既不在 java.exe 文件夹中,也不在 GAC 中,因此它不起作用。

看来我唯一的选择是在 GAC 中安装 .NET 程序集(第三方 dll 确实有一个强名称)。

关于c# - 从 Java 调用 .NET 程序集 : JVM crashes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/138355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com