我正在研究用cpp编写的android应用程序(cocos2dx) 现在我正在做一个必须用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部分中调用它?
由于
答案 0 :(得分: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();
}
答案 1 :(得分:1)
我不记得JNI是如何工作的。但是你需要做的是创建一个包含回调指针的类,该回调指针是使用JNI的混合Java / C ++类。该类必须从描述回调函数签名的Java接口派生。这个接口可能已经存在,因为这是Java中回调的常见模式。
无法直接在Java中表示C / C ++函数指针。