0
2番目のjniアンドロイドアプリケーションを作成して、ある時点で固執しようとします。jFieldId intがオブジェクトに無効です
この私の基本的な例パッケージです
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の値が更新され、TextViewの中に表示されてクリックされたときに達成しようとしていますlogcat
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実装にあることは明らかです。
アップデート:私は、エラーが発生していない。この2行をコメントした場合、私はJNI実装
jint i = env->GetIntField(cls,fid); //Error 1
env->SetIntField(cls, fid,200); //Error 2
に2つの場所で発生しているエラーを突き止めている
。