|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.12.2011, 17:24 | #1 |
Регистрация: 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. Причина: дополнение |
26.12.2011, 00:58 | #2 |
Регистрация: 17.06.2011
Сообщений: 4
|
эх, походу спасение утопающих - дело рук самих утопающих))) Вроде нашёл решение этой проблемы: http://stackoverflow.com/questions/4...ed-by-c-thread
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вызов метода в другом классе | 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 |