在Android中访问回调上的活动变量

在Android中访问回调上的活动变量,android,callback,native,Android,Callback,Native,我想通过返回的回调访问在OnCreate中初始化的全局变量 并发症: < P>回调来自本地C++代码,因此我将IngItAcess函数中的活动对象传递给C++代码,使C++代码回调java代码。这非常好,因为当从C调用Java方法时,我能够记录日志++ >P>现在,当我从C++代码中得到回调时,我尝试调用一个名为PC的对象(Peer-Calnod)的方法。但现在,当收到回调时,pc总是空的,因此引发空指针异常 我认为这是因为我通过的实例和PC初始化的实例是不同的,我甚至尝试将上下文/活动实例

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

并发症:

< P>回调来自本地C++代码,因此我将IngItAcess函数中的活动对象传递给C++代码,使C++代码回调java代码。这非常好,因为当从C调用Java方法时,我能够记录日志++

>P>现在,当我从C++代码中得到回调时,我尝试调用一个名为PC的对象(Peer-Calnod)的方法。但现在,当收到回调时,pc总是空的,因此引发空指针异常

我认为这是因为我通过的实例和PC初始化的实例是不同的,我甚至尝试将上下文/活动实例传递给C++代码,但是这也不起作用。p> 你知道我做错了什么吗

这是我的活动代码:

   @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变量?我已经尝试将它存储为静态变量,稍后再访问它,但这也不起作用

编辑:

日志:

编辑2:

所以我想我做错了什么,我有一个服务和一个AIDL,所以有两个不同的进程,所以不管发生什么,变量都是空的

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

initialize(new MainActivity());
写这个

initialize(this);
有两点需要注意:

  • 自己创建活动实例是非常糟糕的做法
  • 执行
    newmainActivity()
    时,不会调用
    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对象。

请将添加了日志的logcat发布到post这是logcat中的全部内容?(堆栈似乎被截断)。非常简单的检查:您确定
factory.createPeerConnection
从不返回null吗?是的,我确定pc不为null,因为我将该pc变量用于其他函数,它们工作正常。堆栈有许多不必要的日志来自RESIP C++代码。此外,我还尝试通过服务初始化应用程序。Yopu想让我创建我相关课程的贴纸,并为您发布它们吗?