Java JNI本机dll未返回jobjectArray崩溃VM

Java JNI本机dll未返回jobjectArray崩溃VM,java,c++,jvm,java-native-interface,Java,C++,Jvm,Java Native Interface,我正在开发一个调用本机dll库的Java应用程序。我所称C++方法的代码: JNIEXPORT jobjectArray JNICALL Java_Surf_TopSurfWrapp_computeSurfExtractDescriptor__LSurf_TopSurfVisualword_2Ljava_lang_String_2(JNIEnv *env, jclass c, jobject vw, jstring imagePath) { c = env->GetObjectClass(

我正在开发一个调用本机dll库的Java应用程序。我所称C++方法的代码:

JNIEXPORT jobjectArray JNICALL Java_Surf_TopSurfWrapp_computeSurfExtractDescriptor__LSurf_TopSurfVisualword_2Ljava_lang_String_2(JNIEnv *env, jclass c, jobject vw, jstring imagePath)
{
c = env->GetObjectClass(vw);
printf("start\n");
jobjectArray ret = (jobjectArray) env->NewObjectArray(100, c, vw);

for (int i = 0; i < 100; i++)
{
    jmethodID visualWordConstructor = env->GetMethodID(c, "<init>", "(IFFIFFFF)V");
    jobject element = env->NewObject(c, visualWordConstructor, 1, 1.0, 1.0, 1, 1.0, 1.0, 1.0, 1.0);
    env->SetObjectArrayElement(ret, i, element);
}
    printf("end\n");
return ret;
}
我收到以下JVM错误:

debug:
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000076d73332, pid=3384, tid=1572
#
# JRE version: 7.0-b147
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [ntdll.dll+0x53332]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Programming\Visual Studio projects\GPC\TopSurfWrapp\x64\Release\hs_err_pid3384.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
start
end
Java Result: 1
因为我得到了“开始”和“结束”消息,所以我假设问题在于返回数组。 有问题的帧似乎位于ntdll.dll(它不是我的动态库)。
请帮助。

我在我的系统上测试了您的样本,它运行正常

一些调试提示

1) 在本机代码中使用printf进行调试时,请在每个printf后面加上fflush

printf("debug message\n");
fflush(stdout);
2) 检查来自JNI函数的null返回值

jmethodID visualWordConstructor = env->GetMethodID(c, "<init>", "(IFFIFFFF)V"); 
if(visualWordConstructor==0) {
    // print/fflush an error message or throw an exception or both
    // stop processing and return to java now
}
您将首先看到“结束”,然后看到异常。
这是预期的,因为JNI期间的异常是
排队直到java端获得控制。

我在我的系统上测试了您的示例,它运行良好

一些调试提示

1) 在本机代码中使用printf进行调试时,请在每个printf后面加上fflush

printf("debug message\n");
fflush(stdout);
2) 检查来自JNI函数的null返回值

jmethodID visualWordConstructor = env->GetMethodID(c, "<init>", "(IFFIFFFF)V"); 
if(visualWordConstructor==0) {
    // print/fflush an error message or throw an exception or both
    // stop processing and return to java now
}
您将首先看到“结束”,然后看到异常。
这是预期的,因为JNI期间的异常是
排队,直到java端获得控制。

代码中没有错误检查。您可以使用本机调试器来附加到java进程,并检查dll内部的情况。或者至少检查
env
方法调用和打印调试消息的返回值。返回值很好,在释放我用来计算用于创建jobject的某些值的资源时出现了一些问题。检查代码时没有错误。您可以使用本机调试器来附加到java进程,并检查dll内部的情况。或者至少检查
env
方法调用的返回值并打印调试消息。返回值很好,在释放我用来计算创建jobject的一些值的资源时出现了一些问题。谢谢你的回答,你说得有道理,我已经找出了导致异常访问违规错误的原因,这是一个释放一些资源的问题,我使用这些资源来计算创建jobject的一些值。谢谢你的回答,你说得有道理,我已经找出了导致异常访问违规错误的原因,这是一个释放一些资源的问题,我使用这些资源来计算一些值以创建jobject。