gpt4 book ai didi

android native 代码调用java方法成功,但ui方法失败

转载 作者:太空狗 更新时间:2023-10-29 13:35:19 26 4
gpt4 key购买 nike

我成功走原生调用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
}
... ...
}

我真的不知道为什么会这样。我希望 TextView 在事件推送到 java 的 onMyListener 时显示。

最佳答案

终于找到ui方法无法调用的原因了

我的 Native Call Java 使用 CallStaticVoidMethod(...),这意味着类方法。

“私有(private) TextView 信息”不是静态的,这意味着对象变量。

虽然onMyListener不是静态的,但是它可以使用非静态的成员信息。

native 静态方法 -> Java 非静态方法 -> Java 非静态变量似乎没问题。=>原生静态方法 --> Java 非静态变量不行。

您不能在类方法中使用对象变量。原因很清楚,但是jni进程隐藏了原因。

干得好!一开始我怀疑这种静态使用,今天我尝试了 CallVoidMethod 并成功了。

关于android native 代码调用java方法成功,但ui方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com