6

我有一个带有 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 !我刚刚在 mygame for Android 中获得了 " + score + " 积分!!!!";
        Uri uri = Uri.parse(tweetUrl);
        startActivity(new Intent(Intent.ACTION_VIEW, uri));
    }

此功能启动导航器以发布推文。从 Java 调用工作正常。

在我的 C++ InterfaceJNI.h 中,我有:

#ifndef __INTERFACE_JNI_H__
#define __INTERFACE_JNI_H__

#include "cocos2d.h"

类接口JNI
{
上市:
    静态无效 postMessageToFB();
    静态无效 postMessageToTweet();

受保护:

};

#endif // __INTERFACE_JNI_H__

在 InterfaceJNI.cpp 中:

#include "接口JNI.h"
#include "平台/android/jni/JniHelper.h"
#include jni.h >
#include android/log.h >

使用命名空间 cocos2d;

无效接口JNI::postMessageToTweet()
{
    整数状态;
    JNIEnv *env;
    JavaVM *jvm;
    jmethodID 中间;
    jclass mClass;
    布尔 isAttached = false;

    CCLog("静态 postMessageToTweet");

    // 获取状态
    status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6);

    CCLog("状态:%d", status);

    if(状态 AttachCurrentThread(&env, NULL);
        CCLog("状态 2: %d", status);
        if(status GetStaticMethodID(mClass, "tweet", "()V");
    CCLog("mID: %d", mid);

    如果(中!=0)
        env->CallStaticVoidMethod(mClass, mid);
            //------------------------------------------------ ------------
    CCLog("完成");
    如果(已附加)
        jvm->DetachCurrentThread();

    返回;
}

使用以下代码从部分代码调用此接口:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    接口JNI::postMessageToTweet();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    ObjCCalls::trySendATweet();
#万一

在 jvm->GetEnv((void **) &env, JNI_VERSION_1_6); 上返回空指针会发生什么??

4

1 回答 1

2

看起来您的 jvm 变量为空或垃圾。我使用的 Cocos2D-x 版本有一个名为 JniHelper 的类,带有一个静态 ::getJavaVM(); 您可能想要使用的方法。

JavaVM* vm = JniHelper::getJavaVM();
JNIEnv* env;

vm->GetEnv((void**)&env,JNI_VERSION_1_4);  // mine uses JNI_VERSION_1_4

Also, remember to "refresh" your eclipse project every time you build with NDK. You probably do already, but it's worth checking.

于 2012-10-01T19:43:25.100 回答