3

ネイティブ呼び出し Java メソッドのフローに成功しましたが、Java メソッドに ui メソッドが含まれている場合、ui メソッドは常に失敗し、logcat は VM 中止エラーを出力します。

E/ListenerTest( 1399): virtual void JNIListenerContext::postEv(int32_t)
W/dalvikvm( 1399): JNI WARNING: JNI method called with exception pending
W/dalvikvm( 1399):              in Ldalvik/system/NativeStart;.run:()V (CallStaticVoidMethodV)
W/dalvikvm( 1399): Pending exception is:
I/dalvikvm( 1399): "Binder Thread #2" prio=5 tid=10 NATIVE
I/dalvikvm( 1399):   | group="main" sCount=0 dsCount=0 obj=0x413f0b98 self=0x89b7e8
I/dalvikvm( 1399):   | sysTid=1411 nice=0 sched=0/0 cgrp=default handle=8998000
I/dalvikvm( 1399):   | schedstat=( 0 0 0 ) utm=0 stm=0 core=0
I/dalvikvm( 1399):   at dalvik.system.NativeStart.run(Native Method)
I/dalvikvm( 1399):
E/dalvikvm( 1399): VM aborting

私のネイティブコードでは:

JNIEnv *env = AndroidRuntime::getJNIEnv();
env->CallStaticVoidMethod( jclass, jmethod, arg);// call java method postEv(arg)

私のJavaコードでは:

class ListenerClass {
    ... ...
    private static Listener mListener = null;
    public interface Listener {
        public void onMyListener( int arg );
    }

    public void registerListener (Listener listener) {
        Log.d( TAG,"registerListener");
        mListener = listener;
    }

    public static void postEv( int arg ) {
        Log.d( TAG,"postEv");
        if( mListener != null ) {
            mListener.onMyListener( arg );
        } else {
            Log.d( TAG,"no Listener");
        }
    }
}

public class ListenerDemo extends Activity implements ListenerClass.Listener
    ... ...
    private TextView info;
    private ListenerClass lisener = null;

    public void onCreate(Bundle savedInstanceState) {

        info = (TextView) findViewById(R.id.info);
        info.setTextColor(Color.WHITE);
        info.setTextSize(20);

        info.setText("haha");  // this works

        lisener = new ListenerClass();

        Log.d( TAG,"lisener.registerListener");
        lisener.registerListener(this);

    }

    public void onMyListener( int arg ) {
        Log.d(TAG,"arg is: " + arg );  // this works
        info.setText("haha");  // this not works
    }
    ... ...
}

なぜこれが起こったのか本当にわかりません。そして、イベントがJavaのonMyListenerにプッシュされたときにTextViewを表示したい。

4

1 に答える 1

2

ようやく、ui メソッドが呼び出せない理由がわかりました。

私のネイティブ コール Java は、クラス メソッドを意味する CallStaticVoidMethod(...) を使用します。

「private TextView info」は静的ではなく、オブジェクト変数を意味します。

onMyListener は静的ではありませんが、静的メンバー情報を使用できません。

ネイティブ静的メソッド -> Java 非静的メソッド -> Java 非静的変数は問題ないようです。=> ネイティブ静的メソッド --> Java 非静的変数は問題ありません。

クラスメソッドでオブジェクト変数を使用することはできません。理由は非常に明確ですが、jni プロセスはその理由を隠しています。

よくやった!最初はこの静的な使用法を疑っていましたが、今日は CallVoidMethod を試してみましたが、成功しました。

于 2012-07-02T06:12:03.127 に答える