JNI метод сбивает JVM после двух вызовов - PullRequest
3 голосов
/ 25 ноября 2011

Что ж, моя проблема в том, что у меня есть метод C ++, который я вызываю из моего Java-приложения с использованием Jni.Проблема в том, что метод работает хорошо при первом вызове, но когда он вызывается во второй раз, сбой JVM.Отображается ошибка:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77d0e39e, pid=3776, tid=3100
#
# JRE version: 6.0_29-b11
# Java VM: Java HotSpot(TM) Client VM (20.4-b02 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [ntdll.dll+0x2e39e]
#
# An error report file with more information is saved as:
# C:\Users\OPTIMAL1\workspace\XtremeGUI\hs_err_pid3776.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

А вот метод C ++, который вызывается из моего Java-приложения с использованием Jni:

JNIEXPORT void JNICALL Java_MainFrame_Jni_Functions_displayParameterResults  (JNIEnv *env, jobject obj){

cout << "begin!!!!!!!!!!!!!!" << endl;

cout << "before!!!!!!!!!!!!!!" << endl;
jclass jclazz = env->FindClass("MainFrame/Jni/TablesObjects");
cout << "after***************" << jclazz <<endl;


int size = xtremeDataGA.resultsData.parameter.size();
jdouble* jdbl = new jdouble(size);
for(int i=0; i<size; i++)
    jdbl[i] = xtremeDataGA.resultsData.parameter.at(i).at(0).at(0);
jdoubleArray jdblArr = env->NewDoubleArray(size);
env->SetDoubleArrayRegion(jdblArr, 0, size, jdbl);


jclass jStringClass   = env->FindClass("java/lang/String"); 
jobjectArray jStringArray = env->NewObjectArray(6, jStringClass, 0);
for(int i=0; i<6; i++)
    env->SetObjectArrayElement(jStringArray, i, env->NewStringUTF("a") );


jmethodID mid = env->GetStaticMethodID(jclazz, "resultsParameterInsertCol", "([Ljava/lang/Object;[D)V");
env->CallStaticVoidMethod(jclazz, mid, jStringArray, jdblArr);

cout << "end!!!!!!!!!!!!!!" << endl;
}

РЕДАКТИРОВАТЬ: ПроблемарешеноТам не было никаких синтаксических ошибок / ошибок кодирования.Ошибка произошла из-за объявления глобального объекта, который мне нужно было повторно объявить локально.

...