如何将 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$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 mantioned(
jobject 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在应用程序中检测到错误:JNI CallStaticObjectMethodV 调用,并带有挂起的异常 java.lang.NoSuchMethodError:无非静态方法 "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);
}
相关文章:
- 正在寻找C++不可变的hashset/hashmap
- 通过JNI传递数据数组的最快方法是什么
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 将 C# DLL 导入 C++ 以用于 JNI
- 用C++包装 Java 库 (JNI)
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- JNI从Android调用C++方法
- JVM 如何执行 JNI
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 如何将字符串数组返回到 java JNI
- JNI 日期值转换问题,在C++中获取不同的长整型值
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- JNI 在应用程序中检测到错误:在为 innerclass 调用 NewObject 时使用了无效的 jobject
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- 无法将DefineClass(JNI)与Qt资源一起使用
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 如何将 int 放入 HashMap jni?
- 在使用 JNI 将 c++ unordered_map转换为 java hashMap之前将其转换为 java hash