首页
社区
课程
招聘
[求助]android 4.4.2 (ART模式)子线程中调用GetFieldID返回0
2014-2-24 15:45 5812

[求助]android 4.4.2 (ART模式)子线程中调用GetFieldID返回0

2014-2-24 15:45
5812
我的代码在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;");

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cache 2014-2-25 18:45
2
0
游客
登录 | 注册 方可回帖
返回