首先,这是我的配置:我正在使用 64 位 win 7 电脑,以及虚拟机中的 XP 32 位 SP3。我使用 Visual Studio 2010 和 Eclipse。
我正在使用以下组件:
- BusinessDll:我想让 java 可以访问的 C# dll(32 位 .NET 框架 3.5)
- Wrapper:C++ dll 32 位,用于将 java 调用转发到 C#。它引用了 c# dll。
- Wrapper Test调用包装函数的 c++ 测试 exe。
- Java 组件:使用 jre7 32 位的测试项目。
我想从 Java 组件中使用 BusinessDll,所以我决定在 C++ 中使用 jna 和包装器。
现在这里是我已经完成的调用测试:
Wrapper 测试 -> Wrapper -> BusinessDll ----> OK
Java 组件 -> 包装器 ----> 确定
- Java 组件 -> Wrapper -> BusinessDll ----> KO
留言:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (0xe0434352), pid=264, tid=6488
#
# JRE version: 7.0_25-b16
# Java VM: Java HotSpot(TM) Client VM (23.25-b01 mixed mode windows-x86 )
# Problematic frame:
# C [KERNELBASE.dll+0xc41f] RaiseException+0x58
崩溃堆栈:
Stack: [0x00810000,0x00860000], sp=0x0085e13c, free space=312k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [KERNELBASE.dll+0xc41f] RaiseException+0x58
C [clr.dll+0xe2b54] GetCLRFunction+0xd209
C [clr.dll+0x12849b] CopyPDBs+0x4ab5
C [clr.dll+0x2ccacd] CorLaunchApplication+0x255e5
我在 Win 7 64 位和 XP 32 位虚拟机上得到了相同的结果。
接下来,我使用的代码:
Java 组件
System.load("D:\\dev\\Wrapper.dll");
public interface BioWrapp extends Library
{
Wrapp INSTANCE = (Wrapp) Native.loadLibrary("Wrapper", Wrapp.class);
void SuperDummy();
}
public static void main(String[] args)
{
BioWrapp mysdll = BioWrapp.INSTANCE;
mysdll.BioSuperDummy();
}
包装器
Java接口.h
#ifdef BIOWRAPPDLL_EXPORTS
#define BIOWRAPPDLL_API __declspec(dllexport)
#else
#define BIOWRAPPDLL_API __declspec(dllimport)
#endif
namespace BioJavaWrapperNp
{
class BioJavaWrapper
{
public:
static BIOWRAPPDLL_API void BioSuperDummy();
};
}
点网接口.h
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) void superDummy( );
#ifdef __cplusplus
}
#endif
包装器.cpp
#include "stdafx.h"
#include "BioJavaWrapper.h"
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace BioBusiness;
namespace BioBusinessNp
{
void BioJavaWrapper::BioSuperDummy()
{
BusinessClass::superDummy();
}
}
使用 C# dll 中 BioBusiness 命名空间的 BusinessClass 部分。而superDummy是BioBusiness的一种方法。
我已经尝试了几天了,欢迎任何想法。谢谢阅读。
阿德里安