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
에서 두 위치에서 발생하는되는 오류를 추적 한
.