Не могу позвонить из C ++ в Java, используя JNI

У меня есть небольшой проект с библиотеками 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); ?

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. Вы, вероятно, уже делаете, но это стоит проверить.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]