首先,这是我的配置: 我正在开发64位win 7 pc,以及虚拟机中的XP 32位SP3。 我使用Visual Studio 2010和eclipse。
我正在使用以下组件:
我想从Java组件中使用BusinessDll,所以我决定在C ++中使用jna和包装器。
现在我已经完成了调用测试:
包装测试 - >包装 - > BusinessDll ---->确定
Java组件 - >包装----->确定
带有消息:
#
# 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();
}
包装
JavaInterface.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();
};
}
DotNetInterface.h
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) void superDummy( );
#ifdef __cplusplus
}
#endif
Wrapper.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();
}
}
BusinessClass是C#dll中BioBusiness命名空间的一部分。而superDummy是BioBusiness的一种方法。
我已经尝试了几天,欢迎任何想法。 谢谢你的阅读。
阿德里安
答案 0 :(得分:1)
您的C ++ DLL是由托管C ++编写的,我加倍,这就是您遇到此异常的原因。我想你可以试试这个: 1.在本机C ++中编写包装DLL,它将调用混合C ++ DLL中的函数,然后混合C ++将调用C#DLL中的函数 2.在本机C ++中编写包装器DLL,并将C#DLL导出为COM,然后在本机C ++ DLL中使用此COM组件。
还有一件事:内部错误(0xe0434352)。 0xe0434352表示CLR生成此异常。您可以使用Windbg获取异常的详细信息。请阅读此article