当前位置: 首页 > 知识库问答 >
问题:

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

吴开宇
2023-03-14

在尝试从cpp类调用java中的函数以在memmory中保存布尔值时,出现以下错误。我正在使用一个名为MyAdapter的类。cpp调用MyAdapterJni函数。cpp。我用MyAdapterJni编写了以下函数。清洁石油产品

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.游戏

谁能告诉我是什么导致了这个错误

共有3个答案

刁远
2023-03-14

我也遇到了这个问题,在我的例子中,在主UI线程上运行java方法功能解决了我的问题。e、 g.在java方法内部

Activity ac=(Activity) context;
     ac.runOnUiThread(new Runnable() 
     {
         public void run() 
            {
                 //your code here
            }
     });
吕皓
2023-03-14

试着获取运行这个的活动的实例(比如cocos2dxActivity),并在runonUiThread中实现。。。。

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

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

    }
}

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

程峻
2023-03-14

MyManager的初始化抛出一个NullPointerException,这可能会阻止确定方法id,因此您可能需要查看一下。请注意,不仅类初始值设定项可以引发此问题,还可以引发任何静态字段的初始化。您可以将所有初始化放在类初始值设定项中,然后从那里进行调试,其中必须有null。

 类似资料:
  • 我不明白为什么我总是得到这个错误

  • 我的C代码无法找到Java中的公共静态函数调用。它成功地找到了类,没有错误。 我试图将结果返回给回调方法。“5”稍后将被更复杂的内容取代。 我在StackOverflow上似乎也有类似的问题,但是到目前为止没有任何变化似乎有所帮助。也许我有逻辑错误? 我的JNI(更新#2): 此代码包含在此函数中调用的方法中: 我的Java(更新#1): 签名检查: javap-s-pcecutils 公共静态响

  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在

  • 问题内容: 我尝试在Android NDK上工作,我的第一个测试不是很确定,我需要帮助,因为我看不到错误在哪里。 以下代码可以毫无问题地进行编译,但是当在模拟器上运行时,该程序将返回SIGSEGV信号,并且在logcat中不会显式写入任何错误。但是,将显示一条警告,指出未找到Java类。经过一天的研究,这个问题看起来一切正确。 这是我的Java代码:JNITestActivity.java 这是我

  • 问题内容: 我想在Qt中使用JNI调用Android Java方法。我无法理解一个奇怪的“方法签名”参数。这是什么,我应该如何设置? 在示例中,它类似于或。这是什么意思? 例如: 问题答案: 所有这些都在文档中进行了说明。 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html 您的方法采用两个整数作为参数

  • 问题内容: 我创建了一个C ++类,应该通过以下方式调用:http : //docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp9502。 我没有使其正常工作,所以我遵循了:http : //www.coderanch.com/t/525082/CPP/create-JVM-native-code- c