У меня есть небольшой проект с библиотеками cocos2d-x. Я пытаюсь использовать C ++ для вызова функции Java, но я получаю исключение сигнала 11 в строке:
// Get Status
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);
Но я не знаю, почему это происходит.
В моем Java-классе Getsocial.java существует эта функция:
приватный твит { Оценка строки = "123"; String tweetUrl = "https://twitter.com/intent/tweet?text=Hello! Я только что получил" + Score + "очков в моей игре для Android !!!!"; Uri uri = Uri.parse (tweetUrl); startActivity (новое намерение (Intent.ACTION_VIEW, uri)); }
Эта функция запускает навигатор для публикации твита. Вызывается с Java, работает нормально.
В моем C ++ интерфейсе JNI.h у меня есть:
#ifndef __INTERFACE_JNI_H__ #define __INTERFACE_JNI_H__ #include "cocos2d.h" Интерфейс классаJNI { общественности: static void postMessageToFB (); static void postMessageToTweet (); защищенный: }; #endif // __INTERFACE_JNI_H__
И в Интерфейсе JNI.cpp:
#include "InterfaceJNI.h" #include "платформа / android / jni / JniHelper.h" #include jni.h> #include android / log.h> использование пространства имен cocos2d; void InterfaceJNI :: postMessageToTweet () { статус int; JNIEnv * env; JavaVM * jvm; jmethodID mid; jclass mClass; bool isAttached = false; CCLog ("Статический постMessageToTweet"); // Получить статус status = jvm-> GetEnv ((void **) env, JNI_VERSION_1_6); CCLog («Статус:% d», статус); if (состояние AttachCurrentThread (env, NULL); CCLog («Статус 2:% d», статус); if (статус GetStaticMethodID (mClass, "tweet", "() V"); CCLog («mID:% d», середина); если (середина! = 0) env-> CallStaticVoidMethod (mClass, mid); // ------------------------------------------------ ----------- CCLog ( "Конец"); если (isAttached) jvm-> DetachCurrentThread (); вернуть; }
Этот интерфейс вызывается из части кода с использованием:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) InterfaceJNI :: postMessageToTweet (); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) ObjCCalls :: trySendATweet (); #endif
Что происходит, чтобы вернуть нулевой указатель на jvm-> GetEnv ((void **) &env, JNI_VERSION_1_6); ?
Похоже, ваша переменная jvm пустая или мусорная. В используемой мной версии Cocos2D-x есть класс JniHelper со static :: getJavaVM (); метод, который вы можете использовать.
JavaVM* vm = JniHelper::getJavaVM();
JNIEnv* env;
vm->GetEnv((void**)&env,JNI_VERSION_1_4); // mine uses JNI_VERSION_1_4
Кроме того, не забывайте «обновлять» ваш проект Eclipse каждый раз, когда вы строите его с помощью NDK. Вы, вероятно, уже делаете, но это стоит проверить.
Других решений пока нет …