【发布时间】:2010-08-17 15:55:35
【问题描述】:
这是我的问题。
我有一个第三方 DLL(我没有它的源代码),我必须使用 JNI 与之通信。提供这个 DLL 的人不是 Java 公司。我在他们的 DLL 中发现了一个错误,因此编写了一些 C++ 来运行他们的 DLL,暴露了错误并将其发送给他们进行修复。我终于从他们那里得到了一个更新的 DLL,运行了我的 C++ 代码(运行良好),发现这个 bug 确实已经修复了。
但是,现在当我在我的 JNI 代码中使用这个新的 DLL 时,我会抛出以下异常;
Exception c0000005, at 1EEE3416
Access violation: attempting to read memory at address 00000004
Native function stack data: 0,3f49c0,20201,801c6,65637845,6f697470,3063206e,30303030
com.jniwrapper.FunctionExecutionException: c0000005
at com.jniwrapper.Function.invokeCFunc(Native Method)
at com.jniwrapper.FunctionCall.a(SourceFile:127)
at com.jniwrapper.FunctionCall.call(SourceFile:35)
at com.jniwrapper.Function.invoke(SourceFile:188)
at com.tme.techdoc3.diagnostic.api.denso.DensoApiInvoker.invoke(DensoApiInvoker.java:78)
at com.tme.techdoc3.diagnostic.api.denso.NewDensoApi.invoke(NewDensoApi.java:106)
at com.tme.techdoc3.diagnostic.api.denso.NewDensoApi.connect(NewDensoApi.java:46)
at ConsoleApiRunner.main(ConsoleApiRunner.java:59)
我实际上是在使用 JNIWrapper 来提供我的 JNI 代码,因此为了排除他们的产品引起的问题,我编写了自己的 JNI 代码;但我仍然遇到同样的错误。这让我确信问题出在第三方 DLL 中。
我从我在 DLL 上调用的第一个函数中得到了这个异常(顺便说一下,这个函数中没有错误......)。
我们获得 DLL 的地方已经明确表示他们不支持在 JNI 环境中使用它,即使他们不会向我发送任何类型的发行说明或固定和非固定之间的更改列表DLL。
在政治上,我对此无能为力。实际上,我仅限于 DLL 的这个供应商。
谁能想到为什么这个 DLL 在从 C++ 调用时可以工作,但在 JNI 中调用时不能工作?我一直在使用 JNI 堆栈大小 (-Xss) 和其他一些 JVM 参数,但我要么还没有找到正确的设置,要么我看错了。
非常感谢任何想法。
非常感谢。
编辑:添加我自己的 JNI 代码,看看是否有人能发现错误。
编辑 2:更正了代码复制粘贴错误。
当我使用自己的 JNI 代码时,这里是我正在使用的 .cpp 文件的实现;
#include "stdafx.h"
#include "windows.h"
#include "MyJniApi.h"
#include "ThirdParty.h"
#pragma comment(lib, "ThirdParty.lib");
ThirdPartyThing* thirdParty;
JNIEXPORT jlong JNICALL Java_com_mycompany_jni_MyJniApi_connect(JNIEnv *, jobject) {
long connId = 0L;
thirdParty = new ThirdPartyThing();
long retval = thirdParty->GetConnection(&connId);
if(0 == retval) {
return connId;
} else {
return retval;
}
}
如您所见,它非常简单,当我将指针等弄混时,我看不到那里的任何地方。 (免责声明:这几乎是我 C++ 技能的总和!)
【问题讨论】:
标签: java java-native-interface