haxe提供了类似JNI的方法,来调用extension中的函数。
Lib.load(“命名空间”,”函数名”,”参数个数”);
extension接口文件:
namespace mm{
Facebook* face;
AutoGCRoot *eval_onEvent = 0;
static value set_event_callback( value onCall ){
face =[[Facebook alloc] init];
eval_onEvent = new AutoGCRoot( onCall );
return alloc_bool( true );
}
DEFINE_PRIM( set_event_callback , 1 );
static void FBLogin_method(value login_callback){
[face loginFunc: val_string(login_callback)];
}
DEFINE_PRIM (FBLogin_method, 1);
void hypfb_dispatch_event( const char *sType , const char *sArg1 , const unsigned char *sArg2,int i ){
printf("回调输出%s,%s\n", sType,sArg2);
buffer _buff = alloc_buffer_len(0);
if(sArg2!=nil){
buffer_append_sub(_buff,(char *)sArg2,i);
}
val_call3(
eval_onEvent->get( ) ,
alloc_string( sType ) ,
alloc_string( sArg1 ) ,
buffer_val(_buff)
);
}
}
haxe中的调用部分
private static var set_callback_method = Lib.load ("mm", "set_event_callback", 1);
public function init(){
set_callback_method(callback);
}
private function callback(methodID:String,arg1:String,arg2:Dynamic){
trace(“IOS回调"+ methodID:String +”,”+argument1+”,”+argument2);
}
haxe中的代码先通过set_callback_method将回调的callback传递给接口文件中的eval_onEvent,之后通过指定的methodID在callback函数中进行回调处理。
在接口文件赋值回调函数的同时也实例化了Facebook类,Facebook类用于实现了FacebookSDK的功能。
facebook类中函数调用以及回调示例如下:
-(void)loginFunc:(const char*)callbackFunc{
NSLog(@"facebook登陆开始执行");
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions: @[@"public_profile",@"user_friends"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error){
if(error){
NSLog(@"facebook登陆失败");
// mm::hypfb_dispatch_event(callbackFunc,"false",nil,0);
}else if(result.isCancelled){
NSLog(@"facebook取消登陆");
// mm::hypfb_dispatch_event(callbackFunc,"false",nil,0);
}else{
// mm::hypfb_dispatch_event(callbackFunc,"true",nil,0);
}
}];
}