Java 使用JNI CallBoolean方法的异常信号11
我在这条线路上收到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
// 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函数,现在是非静态的。关键是,函数请求的对象是什么?需要的对象是在其上运行方法的对象
jboolean jReturnValue = env->CallStaticBooleanMethod(mClass,mid);