2017-04-16 1 views
0

두 번째 jni android 응용 프로그램을 빌드하고 한 지점에 고정하십시오.jFieldId가 객체에 유효하지 않습니다.

이 성공적으로 내 기본 예제 패키지

package com.example.angelica.myapplication; 


public class SomeVars { 
    //load library 

    public int aPrivate; 

    public native void UpdateVars(); 
} 

내 JNI를 구현

#include <jni.h> 

extern "C" 
JNIEXPORT void JNICALL 
Java_com_example_angelica_myapplication_SomeVars_UpdateVars(JNIEnv *env, jobject instance) { 

    // TODO 
    jclass cls = getclass(); 
    jfieldID fid = getField("aPrivate"); 

    jint i = env->GetIntField(cls,fid); 

    i = i + 100; 
    env->SetIntField(cls, fid,i); 
} 

내 MainActivity.java 파일

public class MainActivity extends AppCompatActivity { 

    TextView tv; 
    SomeVars var = new SomeVars(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tv = (TextView) findViewById(R.id.sample_text); 

     var.aPrivate = 23; 
     if (var.aPrivate == 23) { 
      tv.setText("23"); 
     }else { 
      tv.setText("Two Hunderd"); 
     } 

     Button button = (Button)findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       var.UpdateVars(); 

       if (var.aPrivate == 23) { 
        tv.setText("23"); 
       }else { 
        tv.setText("Changed"); 
       } 
      } 
     }); 
    } 
} 

프로젝트 빌드를하고, 제대로 실행됩니다. 그러나 버튼을 클릭하면 프로젝트가 비정상적으로 중단됩니다. 나는 logcat 로그를 보려고 노력했다. 그러나 오류의 원인을 이해할 수는 없습니다. 나는 기본적으로 버튼을 aPrivate의 값이 업데이트와 텍스트 뷰에 표시를 클릭 할 때 달성하기 위해 노력하고있는 로그 캣

04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: jfieldID int com.example.angelica.myapplication.SomeVars.aPrivate not valid for an object of class java.lang.Class<com.example.angelica.myapplication.SomeVars> 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470]  in call to GetIntField 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470]  from void com.example.angelica.myapplication.SomeVars.UpdateVars() 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] "main" prio=5 tid=1 Runnable 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] | group="main" sCount=0 dsCount=0 obj=0x7449df60 self=0xa968b400 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] | sysTid=3949 nice=-10 cgrp=default sched=0/0 handle=0xada11534 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] | state=R schedstat=(0 0 0) utm=4 stm=18 core=1 HZ=100 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] | stack=0xbf5fe000-0xbf600000 stackSize=8MB 
04-16 13:34:56.171 3949-3949/com.example.angelica.myapplication A/art: art/runtime/java_vm_ext.cc:470] | held mutexes= "mutator lock"(shared held) 

의 몇 줄을 게시. 내 조회에서 모든 오류가 jni 구현에 있음이 분명합니다.

업데이트 : 나는 오류가 발생하지 않습니다이 두 라인을 주석 처리하면 내가 JNI 구현

jint i = env->GetIntField(cls,fid); //Error 1 
env->SetIntField(cls, fid,200);  //Error 2 

에서 두 위치에서 발생하는되는 오류를 추적 한

.

답변

2

SetIntField를 설정하는데 실수 였기 때문에 인스턴스를 사용하여 필드를 설정해야합니다.

env->SetIntField(cls, fid,200);  //Error 
env->SetIntField(instance, fid, 200); //SOLVED 

이제 모든 것은 좋은

을하고있다
관련 문제