Java 使用JNI CallBoolean方法的异常信号11

Java 使用JNI CallBoolean方法的异常信号11,java,java-native-interface,Java,Java Native Interface,我在这条线路上收到11号信号: // Call bool isInternetConnection() jboolean jReturnValue = env->CallBooleanMethod(mClass,mid); 在这段代码中: /** * Check if Internet Connection is ONLINE */ bool InterfaceJNI::isInternetConnected() { JavaVM* jvm = JniHelper::getJ

我在这条线路上收到11号信号:

// Call bool isInternetConnection()
jboolean jReturnValue = env->CallBooleanMethod(mClass,mid);
在这段代码中:

/**
 * Check if Internet Connection is ONLINE
 */
bool InterfaceJNI::isInternetConnected()
{
    JavaVM* jvm = JniHelper::getJavaVM();
    int status;
    JNIEnv *env;
    jmethodID mid;

    bool isAttached = false;
    bool returnValue = false;

    CCLog("InterfaceJNI isInternetConnected");

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

    if(status < 0)
    {
        CCLog("isInternetConnected Status < 0 Failed to get JNI Enviroment!!!");
        status = jvm->AttachCurrentThread(&env, NULL);
        CCLog("isInternetConnected Status 2: %d", status);
        if(status < 0)
        {
            CCLog("isInternetConnected Status < 0 !!!");
            return false;
        }
        isAttached = true;
        CCLog("isInternetConnected Status isAttached: %d", isAttached);
    }

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

    CCLog("isInternetConnected Finding Class....");
    jclass mClass = env->FindClass("org/example/SocialNetwork/CCSocialNetwork");

    // Get Static bool isInternetConnection()
    CCLog("isInternetConnected Getting method....");
    mid = env->GetMethodID(mClass, "isInternetConnection", "()Z");
    if (mid == 0)
    {
        CCLog("isInternetConnected FAIL GET METHOD STATIC");
        return false;
    }
    CCLog("isInternetConnected Calling method....");
    // Call bool isInternetConnection()
    jboolean jReturnValue = env->CallBooleanMethod(mClass,mid);
    CCLog("Call done ");
    // Convert value from Java to C++
    returnValue = (bool)jReturnValue;
    CCLog("isInternetConnected Done ");

    if(isAttached)
        jvm->DetachCurrentThread();

    // Change for return value
    return returnValue;
}
/**
*检查互联网连接是否在线
*/
bool InterfaceJNI::isInternetConnected()
{
JavaVM*jvm=JniHelper::getJavaVM();
智力状态;
JNIEnv*env;
jmethodidemid;
bool isAttached=false;
bool returnValue=false;
CCLog(“InterfaceJNI互联”);
//获得地位
status=jvm->GetEnv((void**)和env,JNI\u版本1\u 6);
如果(状态<0)
{
CCLog(“isInternetConnected状态<0无法获取JNI环境!!!”;
状态=jvm->AttachCurrentThread(&env,NULL);
CCLog(“isInternetConnected状态2:%d”,状态);
如果(状态<0)
{
CCLog(“isInternetConnected状态<0!!!”;
返回false;
}
isAttached=true;
CCLog(“isInternetConnected状态已连接:%d”,已连接);
}
CCLog(“isInternetConnected状态:%d”,状态);
CCLog(“isInternetConnected查找类…”);
jclass mClass=env->FindClass(“org/example/SocialNetwork/CCSocialNetwork”);
//获取静态bool isInternetConnection()
CCLog(“isInternetConnected获取方法…”);
mid=env->GetMethodID(mClass,“isInternetConnection”,“Z”);
如果(mid==0)
{
CCLog(“isInternetConnected故障获取方法静态”);
返回false;
}
CCLog(“isInternetConnected调用方法…”);
//调用bool isInternetConnection()
jbooleanjreturnvalue=env->CallBooleanMethod(mClass,mid);
CCLog(“呼叫完成”);
/java转换为C++的值
returnValue=(bool)jReturnValue;
CCLog(“isInternetConnected Done”);
如果(已附加)
jvm->DetachCurrentThread();
//更改返回值
返回值;
}
但我不知道为什么。如果我用“()V”进行void调用,效果很好,但是当我尝试调用返回bool no的函数时


发生了什么事?

这是一种静态方法还是非静态方法?代码中的注释表明它是静态的,而方法调用则不是

如果它不是静态的,那么必须使用对象调用
CallBooleanMethod
,而不是像现在这样调用类。否则,您将不得不对该类使用
CallStaticBooleanMethod

jobject someObject = <get or create the object somehow>
jboolean jReturnValue = env->CallBooleanMethod(someObject,mid);

无论哪种方法,您都必须决定是否使用静态方法。

它不是静态方法。在使用静态方法之前,我尝试过,但正如您所知,我遇到了信号总线问题,因此,我更改了Java函数,现在是非静态的。关键是,函数请求的对象是什么?需要的对象是在其上运行方法的对象someObject.isInternetConnected()。
jboolean jReturnValue = env->CallStaticBooleanMethod(mClass,mid);