Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2011, 17:24   #1
Евгений643
 
Регистрация: 17.06.2011
Сообщений: 4
По умолчанию вызов Java метода из c++ (JNI)

Добрый день! У меня вопрос связанный с вызовом Java-метода из С++ (JNI). Конечно же я ознакомился с руководством по этой технологии, приведённым на сайте SUN http://java.sun.com/docs/books/jni/html/fldmeth.html. И если я просто выполняю данный вызов (в соответствии с примерами которые там приводятся, например "InstanceMethodCall" ) то всё работает. Но вот в чём проблема. У меня в коде С++ реализован массив указателей на функции. Т.е. формирую такой массив, заполняю его указателями на функции и после для каждой функции из этого массива открывается отдельный поток и выполняется в нём эта функция. Это я таким образом пытался реализовать механизм событий и подписчиков на них (как в шарпе)) ). Т.е. генериться событие и соответственно исполняются все функции из массива подписанные на него. Это всё работает. Но вот если в одной из таких функций происходит вызов метода из Java (через JNI), то вылетает ошибка:

terminate called after throwing an instance of 'std::runtime_error'
what(): Segmentation fault
Аварийный останов

// код на Java

public class javaExClass {

// этот метод нативный в С++
public native void ConnectionStateJNI();

// этот метод должен быть вызван кодом С++
private void callback() {
System.out.println("In Java");
}

public static void main(String[] args)
{
javaExClass c = new javaExClass();
c.ConnectionStateJNI();
}

static
{
System.loadLibrary("libManager");
}
}

//--------------------------------------

// код на C++

// это массив указателей на функции
vector<void (*)(bool&, std::string&, int&, std::string&, std::string&)> vpfNeighborConnect;

// это функция, которая добавляет в массив указатель
extern "C" void AddPFunToPArray(void (* pRoutConn)(bool&, std::string&, int&, std::string&, std::string&)){
vpfNeighborConnect.push_back(pRoutC onn);
}

JNIEnv * env;
jobject obj;
jmethodID mid;
// это функция, указатель на которую добавляется в массив и должна быть исполнена
void TransferToJavaEvents(bool & conState)
{
//env->CallVoidMethod(obj,mid); // если раскомментировать то не работает
}
JNIEXPORT void JNICALL Java_javaExClass_ConnectionStateJNI (JNIEnv * envT, jobject objT)//jobject obj
{
jclass cls = envT->GetObjectClass(objT);
mid = envT->GetMethodID(cls, "callback", "()V");
if (mid == NULL) {return;}
printf("In C\n");
env = envT;
obj = objT;

//env->CallVoidMethod(obj,mid); // если раскоментировать, то этот вызов отлично работает

AddPFunToPArray(TransferToJavaEvent s); // здесь происходит добавление указателя на функцию TransferToJavaEvents в массив указателей,
}

Подскажите пожалуйста, в чем может быть моя ошибка?

весь код большой, поэтому привожу лишь частично..

Последний раз редактировалось Евгений643; 23.12.2011 в 17:28. Причина: дополнение
Евгений643 вне форума Ответить с цитированием
Старый 26.12.2011, 00:58   #2
Евгений643
 
Регистрация: 17.06.2011
Сообщений: 4
По умолчанию

эх, походу спасение утопающих - дело рук самих утопающих))) Вроде нашёл решение этой проблемы: http://stackoverflow.com/questions/4...ed-by-c-thread
Евгений643 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов метода в другом классе jec Общие вопросы C/C++ 8 31.12.2010 21:16
Вызов метода из метода kuzjma PHP 8 10.12.2010 02:38
Вызов метода в asm вставке. Mixasik Общие вопросы Delphi 3 20.02.2010 10:42
JNI вызов java методов из С++ belka_cj Общие вопросы по Java, Java SE, Kotlin 0 24.11.2009 19:36
Вызов Метода из др. модуля Mickle Общие вопросы Delphi 2 10.05.2007 23:41