有没有办法从 JNI 获取 Java 线程(ID,名称)。 我不是在谈论将Thread.currentThread().getId()从 java 传递给 JNI。 JNI 是否提供 API 来访问当前正在运行的线程? ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我在 Java 端有ArrayList<Pair<Pair<Float, Float>, Pair<Float, Float>>>
并想在 JNI 中使用这些数据。
使用什么方法和类来转换为std::pair<std::pair<float, float>, std::pair<float, float>>
我试过以下
jclass pairClass = env->FindClass("android/util/Pair");
jfieldID pairGetKey = env->GetFieldID(pairClass, "first", "java/util/Objects");
pairGetKey
总是 null
字段的类型必须作为签名给出; 也就是说,你需要使用int
-> I
, T[]
-> [T
, reference.Type
-> Lreference/Type;
编码。 此外,该字段的类型是java.lang.Object
,而不是java.util.Objects
。
jfieldID first = env->GetFieldID(pairClass, "first", "Ljava/lang/Object;");
jfieldID second = env->GetFieldID(pairClass, "second", "Ljava/lang/Object;");
rest 很乏味,但并不难:
jfloat extract_float(JNIEnv *env, jobject f) {
// Note the syntax of signatures: float floatValue() has signature "()F"
return env->CallFloatMethod(f,
env->GetMethodID(env->FindClass("java/lang/Float"), "floatValue", "()F"));
}
std::pair<jobject, jobject> extract_pair(JNIEnv *env, jobject p) {
jclass pairClass = env->FindClass("android/util/Pair");
jfieldID first = env->GetFieldID(pairClass, "first", "Ljava/lang/Object;");
jfieldID second = env->GetFieldID(pairClass, "second", "Ljava/lang/Object;");
return std::pair(env->GetObjectField(p, first), env->GetObjectField(p, second));
}
JNIEnv *env;
jobject pair;
auto [f1, f2] = extract_pair(env, pair);
auto [f11, f12] = extract_pair(env, f1);
auto [f21, f22] = extract_pair(env, f2);
std::pair p(
std::pair(extract_float(env, f11), extract_float(env, f12)),
std::pair(extract_float(env, f21), extract_float(env, f22)));
不过,我想我必须问,你真的需要这样做吗? 你能在 Java 端将嵌套对预处理成更好的东西吗? 在这方面做是丑陋的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.