在Android中访问Activity的Callback变量



我想访问一个全局变量,该变量通过返回的回调在OnCreate中初始化。

并发症:

  1. 回调来自本地c++代码,因此我在初始化函数中传递活动的对象,以便c++代码回调Java代码。当我的Java方法从c++

  2. 调用时,我可以记录日志。
  3. 现在当我从c++代码中获得回调时,我尝试调用一个名为pc.(PeerConnection)的对象的方法。但是现在,当收到回调时,pc总是null,从而抛出空指针异常。

我认为这是由于我传递的活动实例和pc初始化的实例不同,我甚至尝试将上下文/活动实例传递给c++代码,但这也不起作用。

你知道我可能做错了什么吗?

这是我的活动代码:
   @Override
       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initialize(new MainActivity());   // This is native function which takes the object name
            PeerConnectionFactory factory = new PeerConnectionFactory();
            MediaConstraints pcConstraints = sdpMediaConstraints;
            pcConstraints.optional.add(
            new MediaConstraints.KeyValuePair("RtpDataChannels", "true"));
            pcConstraints.optional.add(
            new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
            pc = factory.createPeerConnection(iceServers, pcConstraints, pcObserver); // This is where pc is assigned 
       }
       //Callback from the C++ code
       public void onConnected(){
             Log.d("Log", "Came in onConnected state from C++ " ); // This log is printed and works fine
             pc.setSdp();    // This is where it fails, it just doesn't find pc 

       }

有没有人知道我能做些什么来访问回调中的pc变量?我已经尝试将其存储为静态变量并稍后访问它,但这也不起作用。

编辑:

Logcat: http://paste2.org/A0ea06wK

编辑2:

所以我知道我做错了什么,我有一个服务和一个AIDL,所以有2个不同的进程,因此变量无论如何都是空的。

我仍然不知道如何访问一个进程的变量后,我收到从另一个进程的回调

代替

initialize(new MainActivity());

写这

initialize(this);

有两点需要注意:

    自己创建Activity实例是非常糟糕的做法。
  • 当您执行new MainActivity()时,onCreate(...)不会被调用,因此pc永远不会初始化。

我甚至尝试传递上下文/活动实例到c++代码,但这也不工作

怎么回事?相同的NPE ?是的,可能是在执行initialize()期间本机代码回调onConnected()。所以只要这样做:

PeerConnectionFactory factory = new PeerConnectionFactory();
MediaConstraints pcConstraints = sdpMediaConstraints;
pcConstraints.optional.add(
new MediaConstraints.KeyValuePair("RtpDataChannels", "true"));
pcConstraints.optional.add(
new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
pc = factory.createPeerConnection(iceServers, pcConstraints, pcObserver); // This is where pc is assigned 
initialize(this);   // This is native function which takes the object name

正如我提到的,实际的问题是我试图跨进程访问变量。所以我最终通过使用aidl回调机制解决了这个问题。这让我可以使用侦听器机制从后台服务访问UI对象。

相关内容

  • 没有找到相关文章

最新更新