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

时间:2012-12-14 06:48:07

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

尝试从cpp类调用java中的函数以在memmory中保存布尔值时出现以下错误。我正在使用一个名为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);
}

我在logcat上获得以下日志

  

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包里面

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试获取运行它的活动的实例(比如cocos2dxActivity)并在runonUiThread中执行....

public static boolean GetBoolean(String key, boolean defaultValue) {
Cocos2dxActivity.getInstance().runOnUiThread(new Runnable() {

        @Override
        public void run() {
                 return sharedPreferences.getBoolean(key, defaultValue);   
        }
    });

    }
}

注意:它可能会给你一些制作函数参数的错误。希望你能理解,如果没有请随意问...

答案 2 :(得分:0)

我也有这个问题,在我的例子中,在主UI线程上运行我的java方法功能解决了我的问题。例如在你的java方法中

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