2

私は、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 部分で呼び出すことは可能ですか?

ありがとう

4

2 に答える 2

2

私が正しく理解していれば、このようなインターフェースは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();
}
于 2013-03-04T09:32:01.953 に答える
1

JNIがどのように機能するか正確には覚えていません。ただし、JNI を使用してハイブリッド Java/C++ クラスであるコールバック ポインターを保持するクラスを作成する必要があります。そのクラスは、コールバックの関数シグネチャを記述する Java インターフェイスから派生する必要があります。このインターフェースは、Java でのコールバックの一般的なパターンであるため、既に存在している可能性があります。

Java で C/C++ 関数ポインタを直接表現する方法はありません。

于 2013-03-04T07:34:46.353 に答える