如何将cpp回调函数指针发送到java

如何将cpp回调函数指针发送到java,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,我正在开发用cpp(cocos2dx)编写的android应用程序 现在我正在做一个facebook模块,它必须用java实现 facebook调用是异步的,因此我无法知道操作何时完成,除非我有一个从java部分到cpp的回调 例如: JNI部分应该如下所示: void CCAndroidApplication::login2Facebook() { JniMethodInfo minfo; if(JniHelper::getStaticMethodInfo(minfo,

我正在开发用cpp(cocos2dx)编写的android应用程序 现在我正在做一个facebook模块,它必须用java实现

facebook调用是异步的,因此我无法知道操作何时完成,除非我有一个从java部分到cpp的回调

例如:

JNI部分应该如下所示:

void CCAndroidApplication::login2Facebook()
{
    JniMethodInfo minfo;
    if(JniHelper::getStaticMethodInfo(minfo,
        "org/cocos2dx/example/myandroidtest",
        "login2Facebook",
        "(**POINTER TO CALLBACK METHOD DidLogin()**)V")) 
    {
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
        minfo.env->DeleteLocalRef(minfo.classID);
    }
}
java部分应该如下所示:

public static void login2Facebook(**POINTER TO native CALLBACK METHOD DidLogin()**) 
    Session.openActiveSession(me, true, new Session.StatusCallback() 
    {
        @Override
        public void call(Session session, SessionState state, Exception exception) 
        {
            mSession = session;
            if (session.isOpened()) 
            {
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() 
                {
                    @Override
                    public void onCompleted(GraphUser user, Response response) 
                    {
                        if (user != null) 
                        {
                            **Call nativeDidLogin()**;
                        }
                    }
                });
            }
        }
    });
}
如果我可以发送包含以下方法的cpp对象也可以

class delgateMethods
{
public:
    void didLogin();
}
并从java调用它

我的问题是: 是否可以通过JNI发送指向函数的指针,并在java部分调用它


谢谢

我不记得JNI是如何工作的。但是您需要做的是创建一个包含回调指针的类,它是一个使用JNI的Java/C++混合类。该类必须派生自描述回调函数签名的Java接口。这个接口可能已经存在,因为这是Java中回调的常见模式


在Java中无法直接表示C/C++函数指针。

如果我理解正确,这样的接口应该满足您的需要:

从C/C++中,我们可以按名称调用
login2Facebook()

#include "jniFacebook.h"
void didLogin() { /* Did we? */ }
int main() {
    JavaCPP_init(0, NULL); // or initialize the JVM some other way
    login2Facebook(didLogin);
    JavaCPP_uninit();
}

你是说JNI而不是JNDI吗?@AdrianShum:哎呀!唉,是的,JNI,不是JNDI。我想我应该删除我的答案。我希望自从我上次尝试让Java和C相互对话(1998年)以来,技术已经有了一些进步。
#include "jniFacebook.h"
void didLogin() { /* Did we? */ }
int main() {
    JavaCPP_init(0, NULL); // or initialize the JVM some other way
    login2Facebook(didLogin);
    JavaCPP_uninit();
}