如何将 int 放入 HashMap jni 中?

how to put int in HashMap jni?

我有这样的方法

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);
}

最后我得到 Map<String, String> ,现在我想将此地图类型更改为 Map<String, Integer>

所以,我只是将 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$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 提到的那样)

作业对象Profiling::getFullStatistic(JNIEnv *env) { env->PushLocalFrame(256); // 修复本地引用

    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 DETECTED ERROR IN APPLICATION: JNI CallStaticObjectMethodV called with pending exception java.lang.NoSuchMethodError: no non-static method "Ljava/lang/Integer;.valueOf(I)Ljava/lang/Integer;"

从 C++ 调用 Integer#valueOf(int) 并将结果传递给 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);
}