我的代码在dalvikvm中运行一切正常,在4.4.2的ART模式时,在子线程中调用GetFieldID获取一个类的成员(这个成员是一个自定义类)返回0。在主线程中运行是正常的。写了一个测试工程,证明了确实是多线程引起的,但不清楚是什么原因。google了很久也没找到答案,来论坛里救助了。
以下是测试代码。
//java==================================
//Child.java
package com.example.hellojni;
public class Child {
public int value;
}
//Parent.java
package com.example.hellojni;
import com.example.hellojni.Child;
public class Parent {
public int code;
public Child child;
String str;
}
//jni=================================
JNIEnv *env = NULL;
_jvm->AttachCurrentThread(&env, NULL);
//parent_cls and chlid_cls are global variables
parent_cls = (jclass)env->NewGlobalRef(env->FindClass("com/example/hellojni/Parent"));
child_cls = (jclass)env->NewGlobalRef(env->FindClass("com/example/hellojni/Child"));
jmethodID parent_constructor = env->GetMethodID(parent_cls, "<init>", "()V");
jmethodID child_constructor = env->GetMethodID(child_cls, "<init>", "()V");
jobject parent_obj = env->NewObject(parent_cls, parent_constructor);
jobject child_obj = env->NewObject(child_cls, child_constructor);
jfieldID child_field_value = env->GetFieldID(child_cls, "value", "I");
env->SetIntField(child_obj, child_field_value, 20);
jfieldID parent_field_child = env->GetFieldID(parent_cls, "child", "Lcom/example/hellojni/Child;");
__android_log_print(ANDROID_LOG_INFO, "TEST", "parent_field_child = %d", parent_field_child);
env->SetObjectField(parent_obj, parent_field_child, child_obj);
出问题的就是这一句:jfieldID parent_field_child = env->GetFieldID(parent_cls, "child", "Lcom/example/hellojni/Child;");
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)