【问题标题】:How can I send cpp callback function pointer to java如何将 cpp 回调函数指针发送到 java
【发布时间】:2013-03-04 06:15:20
【问题描述】:

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

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 部分中调用它?

谢谢

【问题讨论】:

    标签: java android c++ java-native-interface


    【解决方案1】:

    如果我理解正确,这样的界面应该可以满足您对JavaCPP 的需求:

    @Platform(library="Facebook")
    public class Facebook {
        public static class DidLogin extends FunctionPointer {
            public native void call();
        }
    
        public static class Login2Facebook extends FunctionPointer {
            public @Name("login2Facebook") void call(DidLogin didLogin) { 
                didLogin.call()
            }
        }
    }
    

    在 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();
    }
    

    【讨论】:

    • 我怀疑我应该删除我的答案。自从我上次不得不尝试让 Java 和 C 相互交流(那是在 1998 年)以来,我预计技术已经有了一些进步。
    【解决方案2】:

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

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

    【讨论】:

    • 你的意思是 JNI 而不是 JNDI?
    • @AdrianShum:哎呀! sigh 是的,JNI,不是 JNDI。
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多