allez
2024-02-21 89a7812f0f067fbbed46f8643c4ff67dc2ecbb94
0312 越南iossdk
4个文件已添加
580 ■■■■■ 已修改文件
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/The2thWorldRES.bundle/TY_AN_34.png 补丁 | 查看 | 原始文档 | blame | 历史
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/The2thWorldRES.bundle/The2thWorldSDKConfig.plist 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/UniversalSDK.h 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/UniversalSDK.mm 478 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/The2thWorldRES.bundle/TY_AN_34.png
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/The2thWorldRES.bundle/The2thWorldSDKConfig.plist
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>JPush_AppKey</key>
    <string>111a5f817592ddc68edc802c</string>
    <key>TTTrack_AppID</key>
    <string>155761</string>
    <key>TrackingIO_AppKey</key>
    <string>12aef4c284c6996703765fe9f7422428</string>
</dict>
</plist>
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/UniversalSDK.h
New file
@@ -0,0 +1,90 @@
//
//  UniversalSDK.h
//  Unity-iPhone
//
//
#ifndef __UNIVERSALSDK_H_
#define __UNIVERSALSDK_H_
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
#import <DevMoHuanFramework/MoHuanSDK.h>
#define UNITY_OBJ_NAME "SDKUtility"
#define UNITY_FUNC_NAME "HandleSdkMessage"
#define S2U_BatteryLevel                1
#define S2U_BatteryCharging             2
#define S2U_SdkInitComplete             3
#define S2U_DeviceInfo                  4
#define S2U_PushClientID                5
#define S2U_FreePlatformInitOk          100
#define S2U_FreePlatformInitFail        101
#define S2U_FreePlatformLoginOk         102
#define S2U_FreePlatformLoginFail       103
#define S2U_FreePlatformLoginCancel     104
#define S2U_FreePlatformLogoutOk        105
#define S2U_FreePlatformLogoutFail      106
#define S2U_FreePlatformSwitchAccountOk 107
#define S2U_FreePlatformPayOk           108
#define S2U_FreePlatformPayFail         109
#define S2U_FreePlatformPayCancel       110
#define S2U_FreePlatformRegisterOk      111
#define S2U_FBShareResult               112  //fb分享结果
#define U2S_BatteryListenStart          1
#define U2S_BatteryListenStop           2
#define U2S_CopyContent                 7
#define U2S_OpenWebView                 8
#define U2S_Init                        9
#define U2S_FreePlatformInit            100
#define U2S_FreePlatformLogin           101
#define U2S_FreePlatformLogout          102
#define U2S_FreePlatformSwitchAccount   103
#define U2S_FreePlatformPay             104
#define U2S_PayFinished                 105
#define U2S_CreateRole                  106
#define U2S_RoleLogin                   107
#define U2S_RoleLevelUp                 108
#define U2S_ShareToFaceBook             112 //FB分享
#define U2S_GotoReview                  113 //前往评分
#define U2S_FansHouse                   120 //粉丝屋
#define U2S_GotoShop                    121 //打开商店
#define U2S_TrackEvent                  122 //自定义事件
#define U2S_JPushAddLocalMessage        200
#define U2S_JPushRemoveLocalMessage     201
#define U2S_MakeKeyAndVisible           300
#define U2S_SendRegistEvent             500
#define U2S_SendLoginEvent              600
#define KIsiPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
static BOOL     JPush_IsProduction = FALSE;
@interface UniversalSDK : NSObject<WKUIDelegate, WKNavigationDelegate> {
    WKWebView* m_UIWebView;
    WKWebView* m_fakeUIWebView;
    UIButton* m_CloseBtn;
}
-(void) HandleUnityMessage:(NSString*) json;
-(void) Init;
-(id) APNativeJSONObject:(NSData*) data;
-(void) QuickSDKInit:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
@end
@interface UniversalSDK ()<MoHuanSDKDelegate>
//@property (weak, nonatomic) IBOutlet UILabel *demoTitleLabel;
//@property(nonatomic)UIInterfaceOrientationMask korientationMask;
//@property (weak, nonatomic) IBOutlet UILabel *resultLabel;
//@property (nonatomic, strong)MoHuanSDK *sdkManager;
//@property (weak, nonatomic) IBOutlet UIImageView *backImageView;
@end
#endif
Channel/IOS/hyyngame/Plugins/The2thWorldSDK/UniversalSDK.mm
New file
@@ -0,0 +1,478 @@
//
//  UniversalSDK.m
//  Unity-iPhone
//
//  Created by 蔡瀚 on 2018/4/24.
//
#import "UniversalSDK.h"
#import "AdSupport/AdSupport.h"
#import "opus.h"
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
#import "SystemConfiguration/CaptiveNetwork.h"
@implementation UniversalSDK
#define CHANNEL_NUM 1
static int s_frequency = 16000;
static int s_bitRate = 20000;
static int s_bandMode = OPUS_BANDWIDTH_WIDEBAND;
static int s_frameSize = 160;
static int sBatteryLevel = -1;
static int sBatteryState = -1;
static NSString* sAppID;
static NSString* sGameID;
static NSString* sUserName;
static NSThread* _thread;
-(id)init
{
     self = [super init];
     m_fakeUIWebView = [[WKWebView alloc] initWithFrame:CGRectZero];
     NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
     NSURLRequest *request = [NSURLRequest requestWithURL:url
                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                           timeoutInterval:10.f];
     [m_fakeUIWebView loadRequest:request];
     return self;
}
-(void) Init
{
    UIDevice *_device = [UIDevice currentDevice];
    _device.batteryMonitoringEnabled = true;
    NSString* _uniqueID = [[NSUserDefaults standardUserDefaults] objectForKey:@"tsw_unique_id"];
    //获取IDFA
    NSString* _idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    if(_uniqueID == NULL || [_uniqueID length] <= 0)
    {
        //判断IDFA是否为空
        BOOL isEmpty = [[_idfa stringByReplacingOccurrencesOfString:@"-" withString:@""] stringByReplacingOccurrencesOfString:@"0" withString:@""].length;
        if (isEmpty) {
            //不为空,将IDFA作为唯一标识
            _uniqueID = _idfa;
        }
        else {
            //为空,获取UUID作为唯一标识
            _uniqueID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        }
        //保存唯一设备标识,如已存在则不进行任何处理
        [[NSUserDefaults standardUserDefaults] setObject:_uniqueID forKey:@"tsw_unique_id"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    // 取得UserAgent
    [m_fakeUIWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable userAgent, NSError * _Nullable error) {
        NSLog(@"%@", userAgent);
        NSString* _userAgent = [NSString stringWithFormat:@"%@", userAgent];
        // 发送设备信息
        NSMutableDictionary *_dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                      _uniqueID,@"unique_id",
                                      _idfa,@"android_id",
                                      [NSNumber numberWithInt:S2U_DeviceInfo],@"code",
                                      _userAgent,@"userAgent",nil];
        [self SendMessageToUnity:_dict];
        }];
    [MoHuanSDK sharedGameSDK] .sdkDelegate = (id<MoHuanSDKDelegate>)self;
    UIViewController *view = UnityGetGLViewController();
    [[MoHuanSDK sharedGameSDK] initSDKwithViewController:view gameId:1135 appId:36 channelId:332];
}
- (void)smpcQpLogoutResult:(NSNotification *)notify {
    NSLog(@"sdk请求退出");
    //注销成功
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:S2U_FreePlatformLogoutOk], @"code", nil];
    [self SendMessageToUnity:_dict];
}
-(void)SendMessageToUnity:(NSDictionary*)dict
{
    BOOL _result = [NSJSONSerialization isValidJSONObject:dict];
    if(_result)
    {
        NSData* _jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
        UnitySendMessage(UNITY_OBJ_NAME, UNITY_FUNC_NAME,
                         [[[NSString alloc] initWithData:_jsonData encoding:NSUTF8StringEncoding] UTF8String]);
    }
}
-(void) BatteryThread {
    while (TRUE)
    {
        [NSThread sleepForTimeInterval:1];
        UIDevice *_device = [UIDevice currentDevice];
        int _state = [_device batteryState];
        if(_state != sBatteryState){
            sBatteryState = _state;
            NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [NSNumber numberWithInt:sBatteryState], @"status",
                                   [NSNumber numberWithInt:S2U_BatteryCharging], @"code", nil];
            [self SendMessageToUnity:_dict];
        }
        int _level = (int)([_device batteryLevel] * 100);
        if(_level != sBatteryLevel){
            sBatteryLevel = _level;
            NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [NSNumber numberWithInt:sBatteryLevel], @"level",
                                   [NSNumber numberWithInt:S2U_BatteryLevel], @"code", nil];
            [self SendMessageToUnity:_dict];
        }
    }
}
-(void) OpenURL:(NSString*) url {
    if(m_UIWebView != NULL) {
        [self btnClick:NULL];
        return;
    }
    CGRect _bounds = UnityGetMainWindow().bounds;
    float _scale = _bounds.size.width / 1334;
    float _width = 982 * _scale;
    float _height = 560 * _scale;
    float _offsetX = (_bounds.size.width - _width) * .5f;
    float _offsetY = (_bounds.size.height - _height) * .5f;
    m_UIWebView = [[WKWebView alloc] initWithFrame:CGRectMake(_offsetX, _offsetY, _width, _height)];
    m_UIWebView.UIDelegate = self;
    m_UIWebView.navigationDelegate = self ;
    m_UIWebView.scrollView.scrollEnabled = YES;
    m_UIWebView.scrollView.bounces = NO;
    NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    [m_UIWebView loadRequest:request];
}
-(void) btnClick:(UIButton*)sender {
    [m_CloseBtn removeFromSuperview];
    [m_CloseBtn removeTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    m_CloseBtn = NULL;
    NSURLCache *_cache = [NSURLCache sharedURLCache];
    [_cache removeAllCachedResponses];
    [_cache setDiskCapacity:0];
    [_cache setMemoryCapacity:0];
    [m_UIWebView removeFromSuperview];
    m_UIWebView = NULL;
}
//-(void)webViewDidFinishLoad:(WKWebView *)webView{
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
    CGRect _bounds = UnityGetMainWindow().bounds;
    float _scale = _bounds.size.width / 1334;
    float _width = 982 * _scale;
    float _height = 560 * _scale;
    m_CloseBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [m_CloseBtn setFrame:CGRectMake(_width - 600 * _scale, _height - 86 * _scale, 360 * _scale, 72 * _scale)];
    [m_CloseBtn setTitle:@"我知道了" forState:UIControlStateNormal];
    NSString *_bundlePath = [[NSBundle mainBundle] pathForResource:@"The2thWorldRES.bundle" ofType:nil];
    NSBundle *_bundle = [NSBundle bundleWithPath:_bundlePath];
    NSString *pic1Path = [_bundle pathForResource:@"TY_AN_34.png" ofType:nil];
    [m_CloseBtn setBackgroundImage:[UIImage imageWithContentsOfFile:pic1Path] forState:UIControlStateNormal];
    [m_CloseBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [m_CloseBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    [m_UIWebView addSubview:m_CloseBtn];
    UIView *view = UnityGetGLViewController().view;
    [view addSubview:m_UIWebView];
}
-(void)QuickSDKInit:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"初始化成功");
    [[MoHuanSDK sharedGameSDK] application:application
                  didFinishLaunchingWithOptions:launchOptions];
    NSMutableDictionary *_dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:S2U_SdkInitComplete], @"code",
                                  @"hyyn", @"channelPlatform", nil];
    [self SendMessageToUnity:_dict];
}
#pragma mark - 回调结果
- (void)onInitSuccess
{
    NSLog(@"\n***************初始化成功****************");
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:S2U_FreePlatformInitOk], @"code", nil];
    [self SendMessageToUnity:_dict];
}
- (void)onInitFail:(NSError *)kerror
{
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:S2U_FreePlatformInitFail], @"code", nil];
    [self SendMessageToUnity:_dict];
}
- (void)onLoginSuccess:(id )user
{
    NSString *uid = user[@"user_id"];
    NSString *gameUID = [NSString stringWithFormat:@"%@@1", uid];
    NSString *UserName = user[@"user_name"];
    NSLog(@" 登陆参数:「%@ %@ %@」", uid, user[@"timestamp"], user[@"sign"]);
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSDictionary dictionaryWithObjectsAndKeys:user[@"sign"], @"token",
                            UserName, @"userName",
                            user[@"timestamp"], @"token_expire",
                            gameUID, @"account", nil],@"info",
                           [NSNumber numberWithInt:S2U_FreePlatformLoginOk], @"code", nil];
    [self SendMessageToUnity:_dict];
}
- (void)onLoginFail:(NSError *)kerror
{
    //self.resultLabel.text = [NSString stringWithFormat:@"登录失败\nerror:%@",kerror.localizedDescription];
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSNumber numberWithInt:S2U_FreePlatformLoginFail], @"code", nil];
    [self SendMessageToUnity:_dict];
}
- (void)onLogout
{
    NSLog(@"注销");
    //self.resultLabel.text = @"注销成功";
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSNumber numberWithInt:S2U_FreePlatformLogoutOk], @"code", nil];
    [self SendMessageToUnity:_dict];
}
- (void)onPaySuccess{
    NSLog(@"充值调用返回");
    NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSNumber numberWithInt:S2U_FreePlatformPayOk], @"code", nil];
    [self SendMessageToUnity:_dict];
}
-(id) APNativeJSONObject:(NSData *)data{
    if (!data) {
        return nil;
    }
    NSError *error = nil;
    id retId = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
    if (error) {
        NSLog(@"%s trans data to obj with error: %@", __func__, error);
        return nil;
    }
    return retId;
}
-(void)HandleUnityMessage:(NSString *)json {
    NSLog(@"收到Unity发来的消息 => %@", json);
    NSData *_jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *_dict = [self APNativeJSONObject:_jsonData];
    switch([[_dict objectForKey:@"code"] intValue]){
        case U2S_Init:
            sAppID = _dict[@"appID"];
            sGameID = _dict[@"gameID"];
            [self Init];
            break;
        case U2S_CopyContent:
            [UIPasteboard generalPasteboard].string = _dict[@"content"];
            break;
        case U2S_FreePlatformInit:
            break;
        case U2S_MakeKeyAndVisible:
        {
            UIWindow * _window = [[UIApplication sharedApplication].delegate window];
            if (_window != nil && _window.rootViewController != nil) {
                [_window makeKeyAndVisible];
            }
        }
            break;
        case U2S_OpenWebView:
            [self OpenURL:_dict[@"url"]];
            break;
        case U2S_FreePlatformLogin:
        {
            [[MoHuanSDK sharedGameSDK] login];
        }
            break;
        case U2S_FreePlatformLogout:
        {
            [[MoHuanSDK sharedGameSDK] logout];
        }
            break;
        case U2S_CreateRole:
        {
            [[MoHuanSDK sharedGameSDK] roleCreateWithRoleId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]] roleName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]] roleLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]] serverName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]] serverId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]] userMoney:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"money"]] vipLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"vipLevel"]]];
            break;
        }
        case U2S_RoleLogin:
        {
            // 更新角色信息
            [[MoHuanSDK sharedGameSDK] roleLoginWithRoleId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]] roleName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]] roleLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]] serverName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]] serverId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]] userMoney:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"money"]] vipLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"vipLevel"]]];
            break;
        }
        case U2S_RoleLevelUp:
        {
            // 更新角色信息
            [[MoHuanSDK sharedGameSDK] roleLevelUpWithRoleId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]] roleName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]] roleLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]] serverName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]] serverId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]] userMoney:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"money"]] vipLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"vipLevel"]]];
            break;
        }
        case U2S_FreePlatformPay:
        {
            NSString *extra = [NSString stringWithFormat:@"1_%@_%@_%@", [NSString stringWithFormat:@"%@", [_dict objectForKey:@"orderId"]],
                               [NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]],
                               [NSString stringWithFormat:@"%@", [_dict objectForKey:@"cpInfo"]]];
            [[MoHuanSDK sharedGameSDK] IAPWithProductId:[NSString stringWithFormat:@"%@", [_dict objectForKey:@"cpInfo"]] productDesc:[NSString stringWithFormat:@"%@", [_dict objectForKey:@"title"]] amount:[NSString stringWithFormat:@"%@", [_dict objectForKey:@"mount"]] cpOrderId:[NSString stringWithFormat:@"%@", [_dict objectForKey:@"orderId"]] callBackUrl:@"Pxrv%3A%3EW%3B%26A%26qGEf%5D1%3B4Pip6Lrvc%5BChojgYPV%2A%3B%3Bm%7BBDbK%28kX%3Bm%60Ey40%2CO%609HKz%26T0%268" callBackInfo:extra roleId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]] roleName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]] roleLevel:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]] serverId:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]] serverName:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]]];
            break;
        }
        case U2S_BatteryListenStart:
            if(_thread == NULL)
            {
                _thread = [[NSThread alloc] initWithTarget:self selector:@selector(BatteryThread) object:nil];
                [_thread setName:@"BatteryCheck"];
            }
            if(![_thread isExecuting])
            {
                [_thread start];
            }
            break;
        case U2S_BatteryListenStop:
            break;
        case U2S_ShareToFaceBook:
        {
            [[MoHuanSDK sharedGameSDK] shareUrlWithResult:^(BOOL isSuccess) {
                NSLog(@"%@%@",@"facebookShareURL ",isSuccess?@"YES":@"NO");
                NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                       [NSDictionary dictionaryWithObjectsAndKeys:isSuccess?@"1":@"2", @"state", nil],@"info",
                                       [NSNumber numberWithInt:S2U_FBShareResult], @"code", nil];
                [self SendMessageToUnity:_dict];
            }];
            break;
        }
        case U2S_GotoReview:
            [[MoHuanSDK sharedGameSDK] appStoreReview];
            break;
        case U2S_FansHouse:
            [[MoHuanSDK sharedGameSDK] facebookFansHome];
            break;
        case U2S_GotoShop:
            [[MoHuanSDK sharedGameSDK] appStore];
            break;
        case U2S_TrackEvent:
            //isRepeat:NO仅上报一次,YES允许重复上报(一般看运营要求)
            [[MoHuanSDK sharedGameSDK] reportTrackEvent:[NSString stringWithFormat:@"%@",[_dict objectForKey:@"eventName"]] isRepeat:[[_dict objectForKey:@"eventName"] boolValue]];
            break;
    }
}
@end
extern "C" void native_opus_init(int frequency, int bitRate, int bandMode)
{
    s_frequency = frequency;
    s_bandMode = bandMode;
    s_bitRate = bitRate;
    s_frameSize = frequency / 100;
}
extern "C" int native_opus_encode(opus_int16 *pcm, int len, unsigned char *opus)
{
    int errorCode = 0;
    opus_int32 skip = 0;
    OpusEncoder *enc = opus_encoder_create(s_frequency, CHANNEL_NUM, OPUS_APPLICATION_VOIP, &errorCode);
    if (OPUS_OK != errorCode) {
        enc = NULL;
        return -1;
    }
    opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(s_bandMode));
    opus_encoder_ctl(enc, OPUS_SET_BITRATE(s_bitRate));
    opus_encoder_ctl(enc, OPUS_SET_VBR(1));
    opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10));
    opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0));
    opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_SIGNAL_VOICE));
    opus_encoder_ctl(enc, OPUS_SET_DTX(0));
    opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0));
    opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip));
    opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16));
    unsigned char *rbytes = opus;
    opus_int16 *frame = pcm;
    int totalSize = 0;
    while (len >= s_frameSize)
    {
        opus_int32 length = opus_encode(enc, frame, s_frameSize, rbytes + sizeof(char), s_bitRate);
        rbytes[0] = length;
        frame += s_frameSize;
        rbytes += length + sizeof(char);
        len -= s_frameSize;
        totalSize += (length+1);
    }
    opus_encoder_destroy(enc);
    return totalSize;
}
extern "C" int native_opus_decode(unsigned char *opus, int len, short *pcm)
{
    int err = 0;
    //opus_int32 skip = 0;
    OpusDecoder *dec = opus_decoder_create(s_frequency, CHANNEL_NUM, &err);
    if (err != OPUS_OK) {
        dec = NULL;
        return -1;
    }
    while (len > 0)
    {
        int frame_opus_length = opus[0];
        int length = opus_decode(dec, opus + sizeof(char), frame_opus_length, pcm, s_frameSize, 0);
        opus += sizeof(char) + frame_opus_length;
        pcm += s_frameSize;
        len = len - frame_opus_length - sizeof(char);
    }
    opus_decoder_destroy(dec);
    return 0;
}