네이티브 호출 자바 메소드 의 흐름으로 넘어갔습니다.하지만 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가 표시되기를 원합니다.
네이티브 코드에서 java (jclass, jmethod, arg)에 전달하는 매개 변수를 얻는 방법 – jogabonito
jclass jclaz = env-> FindClass (path); jmethodID jmed = env-> GetStaticMethodID (jclaz, "postEv", "(I) V"); int arg = 123; Java 메서드 onMyListener가 성공했다고해서 이러한 매개 변수에는 아무런 문제가 없습니다. ui 메서드 (info.setText ("haha")) 만 실패했습니다. ui 메소드가없는 경우 java 메소드는 성공을 리턴합니다. –
로그에서 JNI의 보류중인 Exception이있는 것으로 보입니다. Java 메소드 – jogabonito