我想访问一个全局变量,该变量通过返回的回调在OnCreate中初始化。
并发症:
-
回调来自本地c++代码,因此我在初始化函数中传递活动的对象,以便c++代码回调Java代码。当我的Java方法从c++
调用时,我可以记录日志。 现在当我从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对象。