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!Android用のmygameで"+スコア+"ポイントを獲得しました!!!!";
        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"

クラスInterfaceJNI
{{
公衆:
    static void postMessageToFB();
    static void postMessageToTweet();

保護:

};

#endif // __INTERFACE_JNI_H__

そしてInterfaceJNI.cppで:

#include "InterfaceJNI.h"
#include "platform / 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( "静的postMessageToTweet");

    //ステータスを取得
    status = jvm-> GetEnv((void **)&env、JNI_VERSION_1_6);

    CCLog( "ステータス:%d"、ステータス);

    if(status AttachCurrentThread(&env、NULL);
        CCLog( "ステータス2:%d"、ステータス);
        if(status GetStaticMethodID(mClass、 "tweet"、 "()V");
    CCLog( "mID:%d"、mid);

    if(mid!= 0)
        env-> CallStaticVoidMethod(mClass、mid);
            // ------------------------------------------------ -----------
    CCLog( "終了");
    if(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);でnullポインタを返すために何が起こっているのか ?

4

1 に答える 1

2

jvm 変数が null またはガベージのようです。私が使用している Cocos2D-x のバージョンには、 static ::getJavaVM(); を持つ JniHelper というクラスがあります。使用したい方法。

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

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

また、NDK でビルドするたびに、Eclipse プロジェクトを「更新」することを忘れないでください。おそらくすでに行っていると思いますが、確認する価値があります。

于 2012-10-01T19:43:25.100 に答える