2012-06-26 3 views
3

네이티브 호출 자바 메소드 의 흐름으로 넘어갔습니다.하지만 java 메소드에 ui 메소드가 포함되어있을 때 ui 메소드가 항상 실패했습니다. 및 logcat은 VM 중단 오류를 인쇄합니다. 내 자바 코드에서안드로이드 네이티브 코드 호출 자바 메소드 성공,하지만 실패한 메소드

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

:

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 
    } 
    ... ... 
} 
내 네이티브 코드에서

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 

나는 이것이 왜 성공했는지 정말로 모른다. 그리고 이벤트가 java의 onMyListener로 푸시 될 때 TextView가 표시되기를 원합니다.

+0

네이티브 코드에서 java (jclass, jmethod, arg)에 전달하는 매개 변수를 얻는 방법 – jogabonito

+0

jclass jclaz = env-> FindClass (path); jmethodID jmed = env-> GetStaticMethodID (jclaz, "postEv", "(I) V"); int arg = 123; Java 메서드 onMyListener가 성공했다고해서 이러한 매개 변수에는 아무런 문제가 없습니다. ui 메서드 (info.setText ("haha")) 만 실패했습니다. ui 메소드가없는 경우 java 메소드는 성공을 리턴합니다. –

+0

로그에서 JNI의 보류중인 Exception이있는 것으로 보입니다. Java 메소드 – jogabonito

답변

2

마침내 ui 메서드를 호출 할 수없는 이유를 발견했습니다.

내 기본 통화 Java는 CallStaticVoidMethod (...)를 사용합니다. 이는 클래스 메소드를 의미합니다.

"private TextView info"는 정적이 아니며 개체 변수를 의미합니다.

비록 onMyListener가 정적이 아니지만 정적 멤버 정보를 사용할 수는 없습니다.

원시 정적 메서드 -> Java 없음 - 정적 메서드 -> Java 없음 정적 변수가 괜찮은 것 같습니다. => 기본 정적 메서드 -> Java 없음 정적 변수가 좋지 않습니다.

클래스 메서드에서 object 변수를 사용할 수 없습니다. 이유는 매우 명확하지만 jni 프로세스는 이유를 숨 깁니다.

좋은 직장! 처음에는이 정적 사용에 의문이 생겼습니다. 오늘은 CallVoidMethod를 시도하고 성공했습니다.

+0

나는 유사한 문제에 직면했지만 jni _NewObjectA_ 자바 비 정적 메서드를 호출하는 데 사용하고 있습니다. 나는 env-> NewObjectA 정적 메서드가 아닌 믿지만 응용 프로그램은 ui 활동을 호출 할 때 충돌합니다. 이제 TextView를 정적으로 설정 한 후에 응용 프로그램이 충돌하지 않지만주기적인 Java 호출 스레드가 중단 된 후 텍스트를 한 번만 설정합니다! – Shailesh

관련 문제