JNI родной dll не возвращает jobjectArray сбой VM - PullRequest
0 голосов
/ 10 марта 2012

Я занимаюсь разработкой приложения на Java, которое вызывает собственную библиотеку dll.Мой код для метода 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;
}

Я пропустил некоторые вычисления, но проблема, кажется, заключается в том, что JNI возвращает jobjectArray.Мой код Java:

public class Wrapp {
    native public static TopSurfVisualword[] computeSurfExtractDescriptor(TopSurfVisualword initVW, String imagePath);
    static {
        System.loadLibrary("TopSurfWrapp");
    }

    public static void main(String[] args) {
    TopSurfVisualword[] d = TopSurfWrapp.computeSurfExtractDescriptor(new TopSurfVisualword(), "d:\\oil.jpg");
    }
}

Я получаю следующую ошибку 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 Ответ

3 голосов
/ 10 марта 2012

Я протестировал ваш образец на моей системе, и он работает нормально.

Несколько советов по отладке ...

1) При отладке с использованием printf в собственном коде следуйте за каждым printf с помощью fflush.

printf("debug message\n");
fflush(stdout);

2) Проверка на нольвозвращает значения из функций JNI.

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
}

3) Печать в стандартный вывод, а исключения / ошибки во время JNI могут быть сложными.Попробуйте следующее, чтобы наблюдать за поведением.

jclass rx = env->FindClass("java/lang/RuntimeException");
printf("start\n");
fflush(stdout);

env->ThrowNew(rx, "thrown from native code");

printf("end\n");
fflush(stdout);

Сначала вы увидите «конец», а затем увидите исключение.
Это ожидается, поскольку исключения во время JNI ставятся в очередь до тех пор, пока сторона Java не получит контроль.

...