2012-10-01 107 views
6

我有一個使用cocos2d-x庫的小項目。我試圖用C++調用Java的功能,但我在行得到一個信號11例外:無法使用JNI從C++到Java的調用使用JNI

// Get Status 
status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6); 

但我不知道爲什麼會這樣。

在我的Java類Getsocial.java存在這樣的功能:

 
private void tweet() 
    { 
     String score = "123"; 
     String tweetUrl = "https://twitter.com/intent/tweet?text=Hello ! I have just got " + score + " points in mygame for Android !!!!"; 
     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" 

class InterfaceJNI 
{ 
public: 
    static void postMessageToFB(); 
    static void postMessageToTweet(); 

protected: 

}; 

#endif // __INTERFACE_JNI_H__ 

而且在InterfaceJNI.cpp:

 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
    InterfaceJNI::postMessageToTweet(); 
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) 
    ObjCCalls::trySendATweet(); 
#endif 

 
#include "InterfaceJNI.h" 
#include "platform/android/jni/JniHelper.h" 
#include jni.h > 
#include android/log.h > 

using namespace cocos2d; 

void InterfaceJNI::postMessageToTweet() 
{ 
    int status; 
    JNIEnv *env; 
    JavaVM *jvm; 
    jmethodID mid; 
    jclass mClass; 
    bool isAttached = false; 

    CCLog("Static postMessageToTweet"); 

    // Get Status 
    status = jvm->GetEnv((void **) &env, JNI_VERSION_1_6); 

    CCLog("Status: %d", status); 

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

    if (mid!=0) 
     env->CallStaticVoidMethod(mClass, mid); 
      //----------------------------------------------------------- 
    CCLog("Finish"); 
    if(isAttached) 
     jvm->DetachCurrentThread(); 

    return; 
} 

這個接口是使用代碼的部分稱爲

在jvm-> GetEnv((void **)& env,JNI_VERS上返回空指針ION_1_6); ?

回答

2

它看起來像你的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 

此外,記得每次使用NDK構建時,都要「刷新」你的eclipse項目。你可能已經做了,但值得檢查。

+0

這項工作很好啓動功能,現在又失敗了,但謝謝! – vgonisanz