【问题标题】:JNI C++ call onCreate JAVA - FacebookJNI C++ 调用 onCreate JAVA - Facebook
【发布时间】:2013-12-05 19:08:42
【问题描述】:

我用 C++ 在 cocos2dx 上创建了一个游戏,现在我想将它与 Facebook 连接,为此我使用 JAVA 来完成,然后将它与 JNI 连接。这两件事都完美无缺,但要将其与 Facebook 连接,我需要 @override 方法 onCreate(),但我不知道如何从 C++ JNI 调用该方法。

当我将我的 Facebook 代码移动到一个新函数时,我需要执行它

Session.openActiveSession(this, true, new Session.StatusCallback() {}

但是“this”在 onCreate() 之外不存在。有任何想法吗?

1-。如何在不调用 onCreate() 方法的情况下使用 Facebook 登录 {}

2-。如何从 JNI C++ 调用 onCreate 方法?

我的 JNI 代码:

它调用 FacebookLogin,可以正常工作,但不能使用 onCreate

if(JniHelper::getStaticMethodInfo(minfo,
                                      "com/company/game/Facebook",
                                      "facebookLogin",
                                      "()V"))
    {
        jstring StringArg1 = minfo.env->NewStringUTF(msg);
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
        minfo.env->DeleteLocalRef(minfo.classID);
    }

谢谢:D

【问题讨论】:

  • 在此处查看 Cocos2dx 的开源 Plugin-X 项目github.com/cocos2d-x/plugin-x 您可以考虑编写所有 JNI 调用。
  • 嗨@VikasPatidar 我会检查一下,谢谢:D
  • 您好,我也遇到了同样的问题,您的 Facebook 集成是否成功?请告诉我非常感谢
  • 嗨@Khash,是的问题是你需要把它放在Cocos2dxActivity的主Actividty上并分配onEnter act = this。其中act是Cocos2dxActivity,在你调用这个的任何地方,你都会放置act。我将在答案上粘贴代码
  • 嗨@EduardoIglesias,感谢等待代码!

标签: android c++ facebook java-native-interface cocos2d-x


【解决方案1】:

我解决了。

问题是你需要把它放在来自Cocos2dxActivity的主Actividty上并赋值onEnter act = this。其中act是Cocos2dxActivity,在你调用这个的任何地方,你都会放置act

代码:

 public class game extends Cocos2dxActivity{

    static Cocos2dxActivity act;


protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        System.out.println("Super init");
        act = this;
}

public static void FacebookLogin() {
        Session.openActiveSession(act, true, new Session.StatusCallback() {

            // callback when session changes state
            @Override
            public void call(final Session session2, SessionState state, Exception exception) {
                if (session2.isOpened()) {

                    Request.newMeRequest(session2, new Request.GraphUserCallback() {

                          // callback after Graph API response with user object
                          @Override
                          public void onCompleted(GraphUser user, Response response) {
                            if (user != null) {
                              Log.d("Facebook", "Hello " + user.getName() + "! Id: "+user.getId());
                              isLoggedIn(); 
                              String mail = (String)response.getGraphObject().getProperty("email");
                              if (mail == null) {
                                  mail = "null";
                              }
                              userID(user.getId(), mail, user.getName());
                              session = session2;
                            }
                          }
                    }).executeAsync();

                }
            }
          });
    }
}

【讨论】:

  • 嗨@Eduardo,感谢您的代码,我有几个问题:1-您所说的主要活动是什么意思?我的 cocos2dx 主要活动看起来不像这样,它有“System.loadLibrary(“game”);”。 2-“会话=会话2;”中的会话是什么? 3-什么是userID(user.getId(), mail, user.getName()); ?当我使用完全相同的代码时,我收到此错误“此静态方法无法从 Cocos2dxActivity 隐藏实例方法”并建议我删除静态。
  • @Khash,我的方法、userID 和 isLoggedIn 是本机方法。您需要静态,因为它将从 C++ 调用。主要活动,对不起,我的意思是您项目中的主要文件。 “会话=会话2;”是检查会话是否已打开。你可以消除
猜你喜欢
  • 2010-12-19
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多