【问题标题】:JNI return Signal 7 function trying to call to Java from C++JNI 返回 Signal 7 函数试图从 C++ 调用 Java
【发布时间】:2013-03-25 19:50:28
【问题描述】:

我想从 C++ 调用 Java。我尝试调用一个返回布尔值的函数,不带参数。

这是我的 C++ 代码

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

    bool isAttached = false;
    // jboolean o bool?
    bool returnValue = false;

    CCLog("Static isInternetConnected");

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

    if(status < 0)
    {
        //LOGE("callback_handler: failed to get JNI environment, " // "assuming native thread");
        status = jvm->AttachCurrentThread(&env, NULL);
        CCLog("isInternetConnected Status 2: %d", status);
        if(status < 0)
        {
            // LOGE("callback_handler: failed to attach " // "current thread");
            return false;
        }
        isAttached = true;
        CCLog("isInternetConnected Status isAttached: %d", isAttached);
    }


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

    jclass mClass = env->FindClass("org/example/SocialNetwork/InternetConnection");

    // Get Static bool isInternetConnection()
    mid = env->GetStaticMethodID(mClass, "isInternetConnection", "()Z");
    if (mid == 0)
    {
        CCLog("isInternetConnected FAIL GET METHOD STATIC");
        return false;
    }
    // Call Static bool isInternetConnection()
    returnValue = env->CallStaticBooleanMethod(mClass, mid);
    CCLog("isInternetConnected Done ");

            //-----------------------------------------------------------
    CCLog("Finish");
    if(isAttached)
        jvm->DetachCurrentThread();

    // Change for return value
    return returnValue;
}

还有我的 Java 代码:

public class InternetConnection 
{
    /**
     * Check if is working your hello world from C++
     */
    public static void helloWorld()
    {
        Log.v("InternetConnection", "HELLO WORLD");
    }
    /**
     * Check Internet Connection
     * @return true is Online
     */
    public static Boolean isInternetConnection()
    {
        Log.v("InternetConnection", "isInternetConnection Start");

        Context ctx = CCSocialNetwork.getAppContext();
        ConnectivityManager conMgr =  (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo i = conMgr.getActiveNetworkInfo();

        if (i == null)
        {
            Log.v("InternetConnection", "isInternetConnection NULL :S");
            return false;
        }

        if (!i.isConnected())
        {
            Log.v("InternetConnection", "isInternetConnection is not connected");
            return false;
        }

        if (!i.isAvailable())
        {
            Log.v("InternetConnection", "isInternetConnection is not available");
            return false;
        }
        Log.v("InternetConnection", "isInternetConnection DONE!");
        return true;
    }
}

但我明白了:

 Fatal signal 7 (SIGBUS) at 0x00000000 (code=128)

而且我有如果我能正确得到一个返回值,我也不能发送参数。

【问题讨论】:

  • 您正在返回一个布尔值,它实际上是一个对象。尝试返回一个布尔原始类型。
  • 我尝试在 Java 中添加一个布尔值,但不是这样
  • 失败的行是 "mid = env->GetStaticMethodID(mClass, "isInternetConnection", "()Z");"如果我对此发表评论,以及以下如果,则信号不会出现
  • 返回类型必须是布尔值,而不是布尔值。我不知道你所说的“我试图在 Java 中添加一个布尔变量”是什么意思。
  • 嗯,你是对的,将 Boolean 更改为 boolean 就成功了。但是 SIGBUS 仍然出现

标签: java c++ java-native-interface signals cocos2d-x


【解决方案1】:

您正在返回一个实际上是一个对象的布尔值。尝试返回一个布尔原始类型。

【讨论】:

    【解决方案2】:

    你确定 FindClass 没有返回 NULL 吗?你没有检查它

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多