2012-10-01 67 views
6

Tôi có một dự án nhỏ với thư viện cocos2d-x. Tôi đang cố gắng sử dụng C++ để gọi một chức năng Java nhưng tôi nhận được một tín hiệu 11 ngoại lệ tại dòng:Không thể thực hiện cuộc gọi từ C++ sang Java bằng JNI

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

Nhưng tôi không biết tại sao điều này đang xảy ra.

Trong lớp Java của tôi Getsocial.java tồn tại chức năng này:

 
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)); 
    } 

Chức năng này ra mắt navigator để gửi một tweet. Được gọi từ Java hoạt động tốt.

Trong C++ của tôi InterfaceJNI.h tôi có:

 
#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__ 

Và trong InterfaceJNI.cpp:

 
#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; 
} 

Giao diện này được gọi từ một phần của mã sử dụng:

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

Điều gì đang xảy ra để trả về con trỏ rỗng trên jvm-> GetEnv ((void **) & env, JNI_VERS ION_1_6); ?

Trả lời

2

Dường như biến jvm của bạn là rỗng hoặc rác. Phiên bản của Cocos2D-x tôi sử dụng có một lớp được gọi là JniHelper với một static :: getJavaVM(); phương pháp mà bạn có thể muốn sử dụng.

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

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

Ngoài ra, hãy nhớ "làm mới" dự án nhật thực của bạn mỗi lần bạn xây dựng với NDK. Bạn có thể đã làm, nhưng nó có giá trị kiểm tra.

+0

Điều này làm việc tốt để khởi động chức năng, bây giờ thất bại khác với nhưng cảm ơn! – vgonisanz

Các vấn đề liên quan