使用 JNI 从 cpp 调用 java 方法时出现异常

Exception while calling java method from cpp using JNI

本文关键字:异常 方法 java JNI cpp 调用 使用      更新时间:2023-10-16

我在尝试从 cpp 类调用 java 中的函数以在记忆中保存布尔值时收到以下错误。我正在使用一个名为MyAdapter的类.cpp来调用MyAdapterJni.cpp的函数。我有以下函数写在MyAdapterJni中.cpp

bool GetBooleanJni(const char *key, bool defaultValue)
{
     cocos2d::JniMethodInfo methodInfo;
    jboolean ret = false;
    if (! getStaticMethodInfo(methodInfo, "GetBoolean", "(Ljava/lang/String;Z)Z"))
    {
        return ret;
    }
    ret = methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID, defaultValue);
    methodInfo.env->DeleteLocalRef(methodInfo.classID);
    return ret;
}

我在 myManager .java 类中有以下功能

public static boolean GetBoolean(String key, boolean defaultValue)
{
    return sharedPreferences.getBoolean(key, defaultValue);
}

我在我的日志猫上收到以下日志

12-14 12:06:32.024: W/dalvikvm(9575): 异常 Ljava/lang/NullPointerException; 初始化 Lcom/mygames/Game/MyManager 时抛出;

12-14 12:06:32.024:D/libMyManager(9575):找不到 GetBoolean 的静态方法 ID

我的java类在包com.mygames.Game中

任何人都可以告诉我可能导致此错误的原因

MyManager的初始化会抛出一个NullPointerException,这可能会阻止确定方法 id,所以你可能想看看它。请注意,不仅类初始值设定项可以抛出此字段,还可以初始化任何静态字段。您可以将所有初始化放入类初始值设定项中,然后从那里进行调试,必须有null.

尝试获取运行此活动的实例(例如 cocos2dxActivity),并在 runonUiThread 中执行实现。

public static boolean GetBoolean(String key, boolean defaultValue) {
Cocos2dxActivity.getInstance().runOnUiThread(new Runnable() {
        @Override
        public void run() {
                 return sharedPreferences.getBoolean(key, defaultValue);   
        }
    });
    }
}

注意:它可能会在创建函数参数时给您带来一些错误。希望你理解,如果没有,请随时问...

我也遇到了这个问题,就我而言,在主 UI 线程上运行我的 Java 方法功能解决了我的问题。 例如,在您的 Java 方法中

Activity ac=(Activity) context;
     ac.runOnUiThread(new Runnable() 
     {
         public void run() 
            {
                 //your code here
            }
     });