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

如何在HashMap jni中输入int?

岑炯
2023-03-14

我有这样的方法

jobject Profiling::getFullStatistic(JNIEnv *env)
{
    env->PushLocalFrame(256); // fix for local references

    jclass mapClass = env->FindClass("java/util/HashMap");

    if (mapClass == nullptr)
    {
        return nullptr;
    }

    jmethodID init = env->GetMethodID(mapClass, "<init>", "(I)V");
    jobject hashMap = env->NewObject(mapClass, init, m_values.size());
    jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    for (auto &it: m_values)
    {
        env->CallObjectMethod(hashMap, put, env->NewStringUTF(it.first.c_str()), env->NewStringUTF(std::to_string(it.second).c_str()));
    }

    return env->PopLocalFrame(hashMap);
}

最后我得到了地图

所以,我刚刚将put方法的签名更改为

jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;I;)Ljava/lang/Object;");

据我所知,int签名是I。。。

我还改变了这句话

env->CallObjectMethod(hashMap, put, env->NewStringUTF(it.first.c_str()), it.second);

但我知道我犯了这样的错误

JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending 
exception java.lang.NoSuchMethodError: no non-static method 
"Ljava/util/HashMap;.put(Ljava/lang/Object;I;)Ljava/lang/Object;"
at java.util.Map com..ar.JniInterface.getProfilingStatistic(long) 
(JniInterface.java:-2)
at void com..ar.ui.fragments.ar.ArScreen.lambda$testDeleteIt$1$ArScreen() 
(ArScreen.java:156)
at void 
com..ar.ui.fragments.ar.-$$Lambda$ArScreen$zqdXNYFzVzmF_ZYFKJRM26bZzUw.run() 
(lambda:-1)
at void android.os.Handler.handleCallback(android.os.Message) 
(Handler.java:873)
at void android.os.Handler.dispatchMessage(android.os.Message) 
(Handler.java:99)
at void android.os.Looper.loop() (Looper.java:214)
at void android.app.ActivityThread.main(java.lang.String[]) 
(ActivityThread.java:6990)
at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, 
java.lang.Object[]) (Method.java:-2)
at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() 
(RuntimeInit.java:493)
 at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) 
(ZygoteInit.java:1445)

 in call to NewStringUTF
 from java.util.Map com..ar.JniInterface.getProfilingStatistic(long)
 "main" prio=5 tid=1 Runnable
 | group="main" sCount=0 dsCount=0 flags=0 obj=0x76dbefb8 self=0x759e614c00
 | sysTid=18571 nice=-10 cgrp=default sched=0/0 handle=0x76251b3560
 | state=R schedstat=( 1106979853 124044847 973 ) utm=95 stm=15 core=4 HZ=100
 | stack=0x7fc9911000-0x7fc9913000 stackSize=8MB
 | held mutexes= "mutator lock"(shared held)

编辑

如果我尝试将int传递为整数(@Botje命令)

jObject分析::getFullStatiistic(JNIEnv*env){env-

    jclass mapClass = env->FindClass("java/util/HashMap");

    if (mapClass == nullptr)
    {
        return nullptr;
    }

    jmethodID init = env->GetMethodID(mapClass, "<init>", "(I)V");
    jobject hashMap = env->NewObject(mapClass, init, m_values.size());
    jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    jclass j_Integer = env->FindClass("java/lang/Integer");
    jmethodID j_Integer_valueOf = env->GetMethodID(j_Integer, "valueOf", "(I)Ljava/lang/Integer;");

    for (auto &it: m_values)
    {
        jobject j_intValue = env->CallStaticObjectMethod(j_Integer, j_Integer_valueOf, it.second);
        env->CallObjectMethod(hashMap, put, env->NewStringUTF(it.first.c_str()), j_intValue);
    }

    return env->PopLocalFrame(hashMap);
}

我得到这样的错误

JNI在应用程序中检测到错误:调用JNI CallStaticObjectMethodV时出现挂起异常java。lang.NoSuchMethodError:没有非静态方法“Ljava/lang/Integer;.valueOf(I)Ljava/lang/Integer;”


共有1个答案

祝英博
2023-03-14

调用整数#value eOf(int)从C并将结果传递给HashMap#put(Object, Object)

jclass j_Integer = env->FindClass("java/lang/Integer");
jmethodID j_Integer_valueOf = env->GetStaticMethodID(j_Integer, "valueOf", "(I)Ljava/lang/Integer;");
jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

for (auto &it: m_values) {
    jobject j_intValue = env->CallStaticObjectMethod(j_Integer, j_Integer_valueOf, it.second);
    env->CallObjectMethod(hashMap, put, env->NewStringUTF(it.first.c_str()), j_intValue);
}
 类似资料:
  • 问题内容: 我想在eclipse 中的文件中输入字符串,该字符串包含字符,并且我不能毫无错误地将其添加到xml文件中!我什至试图按角色逃避: 或将其包含在以下内容之间: 但没有一个有效。最后,在这里的善良用户的帮助下,我发现这是在xml中输入此类字符的正确方法: 但是现在当我在代码中获得此资源时: 并将其设置为TextView,它将显示在屏幕上!如何通过代码获取原始字符?我应该做一些与HTML相关

  • 我一直在寻找如何弄清楚如何让一个输入或某些东西进入一个time循环。就像在,输入()命令不会停止我的秒表。我尝试过tkinter、pygame和其他几种方法,但它们都不起作用。如果有人能帮我,我更喜欢小而简单的东西,如果这是可能的话。具体来说,我想学习做什么,基本上是允许在按下任何键时立即停止(最好不按回车键)。谢谢,马鞍猪! 以下是我到目前为止的情况,没有任何东西可以激活停止:

  • 我有密码 但是当我在文本字段中输入字符时,它们会保持打印状态,直到我切换到另一个文本字段。我需要完全禁止字符输入,我的意思是当字符输入时,我需要删除字符,或者如果可能的话,以某种方式使字符甚至不出现以供听众处理,当然也不出现在文本字段中。我的意思是只有数字字符必须出现。

  • 我目前正在用Java编写一个程序,其中我需要从用户那里获得输入,这是一段文本。然而,我需要用户能够在一次输入文本的多个段落。当程序提示输入时,只需粘贴整段文本就可以实现这一点。我对输入使用扫描器,当我将多个段落粘贴到输入中时,无论何时打印存储文本的变量,都不会抛出错误,只输出第一节(在第一个换行符之前)。如何使用多个换行符存储整段文本,而不提示用户为每个文本块输入单独的输入? 我已经有了一些代码,

  • 我需要在Google Analytics中显示用户在字段中输入的值。但我不需要查看字段上的点击次数。请帮帮我。

  • 问题内容: 当我尝试获取Integer类型的输入时,我只需要做的就是下面的代码。 但是当涉及到BigInteger时,我不知道该怎么办。如何读取用户的BigInteger类型输入? 问题答案: 参考:Scanner#nextBigInteger