当我尝试使用下面的代码向Facebook发布高分时,我收到此错误:
Invalid indirect reference 0x12341234 in decodeIndirectRef
执行请求时会发生错误。
Bundle params = new Bundle();
params.putString("score", "123");
Request postScoreRequest = new Request(session,
"/me/scores",
params,
HttpMethod.POST,
new Request.Callback() {
@Override
public void onCompleted(Response response) {
FacebookRequestError error = response.getError();
if (error != null) {
Log.d("test", "error: " + error);
} else {
Log.d("test", "success");
}
}
});
postScoreRequest.executeAsync();
上述Java代码是通过JNI从C ++调用的。我有许多类似的C ++到Java JNI方法,可以正常工作。当用户首次登录Facebook时,我尝试运行上面的高分提交代码(因此没有涉及JNI),我没有看到崩溃。
为什么通过JNI调用上面的代码会导致错误?
编辑:我注意到这次崩溃发生在从C ++到Java的下一次JNI调用中。它与高分完全无关。如果我评论postScoreRequest.executeAsync()
那么崩溃就会消失。我试图弄清楚这条线是如何影响JNI的。
编辑:在UI线程上显式创建和执行请求。我仍然想知道为什么会这样。
答案 0 :(得分:1)
假设您的C ++代码运行在与UI线程不同的线程上(因为它是游戏 - >可能是OpenGL - > G1渲染器启动它自己的线程):您的Java线程也不是在UI线程和Facebook的executeAsync
应该在UI线程上运行:
https://developers.facebook.com/docs/reference/android/3.0/class/Request/#executeAsync%28%29
executeAsync()执行此请求并返回响应。这应该只从UI线程调用。
P.S。为了解决这个问题,我打电话给runOnUiThread