jNI callback

#include <stdio.h>
#include <jni.h>
#include "tdnmanager.h"
#define LOG_TAG "Network"
#include "log.h"
#include "NetworkCallback.h"
#include <stdlib.h>

static const char* const kClassNameNetwork =
        "com/apical/aiproforcloud/networklibrary/LibNetwork";
static const char* const kClassNameNetworkCallback =
        "com/apical/aiproforcloud/networklibrary/Callback";    
static const char* const kClassNameDeviceStatus =
        "com/apical/aiproforcloud/networklibrary/DeviceStatusInfo";    
static const char* const kClassNameRemonitoringFileInfo =
        "com/apical/aiproforcloud/networklibrary/RemonitoringFileInfo";
static const char* const kClassNameAlarmRecord =
        "com/apical/aiproforcloud/networklibrary/AlarmRecord";        
static const char* const kClassNameOutOfMemoryException =
        "java/lang/OutOfMemoryError";
static const char* const kClassNameOutOfNullPointerException =
        "java/lang/NullPointerException";
static const char* const devicestatusinfoexceptiondescript = "DeviceStatusInfo -- Get Info Failue";
static const char* const remonitoringfileinfoexceptiondescript = "RemonitoringFileInfo -- Get Info Failue";
static const char* const alarmrecordexceptiondescript = "AlarmRecord -- Get Info Failue";
    static JavaVM* myVm = NULL;
    static jobject Network_Callback = NULL;
    struct fields_t {
    jmethodID callStartNetwork;
    jmethodID callCloseNetWork;
    jmethodID callbackCancelAlarmInfo;
    jmethodID callbackGetDeviceStatus;
    jmethodID callbackVehicleStatus;
    jmethodID callbackStartRealMonitorVideoStream;
    jmethodID callbackStopRealMonitorVideoStream;
    jmethodID callbackDownloadVideo;
    jmethodID callbackException;
    jmethodID callbackAlarmInfo;
    jmethodID callbackFailue;
    jmethodID callbackOvertime;
    jmethodID callbackUploadAlarmVideoCompletely;
    jmethodID callbackAlarmHistory;
    jmethodID callbackUploadFile;
    jmethodID callbackSnapShot;
    jmethodID callbackOpenGpsInfo;
    jmethodID callbackCloseGpsInfo;
    jmethodID callbackDrivingFile;
    }fields;
    jclass jclassDeviceStatusInfo;
    struct devicestatusinfofields_t{
        jfieldID jfieldIDstrDevId;
        jfieldID jfieldIDnState;
        jmethodID jmethodIDinit;
    }devicestatusinfofields;
    jboolean jbdevicestatusinfostate = JNI_FALSE; // 纪录java层DeviceStatusInfo相关对象是否正常获取
    
    jclass jclassRemonitoringFileInfo;
    struct remonitoringfileinfofields_t{
        jfieldID jfieldIDstrFileName;
        jfieldID jfieldIDstrFileTime;
        jfieldID jfieldIDnCanPlay;
        jmethodID jmethodIDinit;
    }remonitoringfileinfofields;
    jboolean jbremonitoringfileinfostate = JNI_FALSE; // 纪录java层RemonitoringFileInfo相关对象是否正常获取
    
    jclass jclassAlarmRecord;
    struct alarmrecordfields_t{
        jfieldID jfieldIDstrDevId;
        jfieldID jfieldIDsalarmType;
        jfieldID jfieldIDstrAlarmTime;
        jfieldID jfieldIDstrFileName;
        jfieldID jfieldIDFileSize;
        jfieldID jfieldIDPlayUrl;
        jmethodID jmethodIDinit;
    }alarmrecordfields;
    jboolean jbalarmrecordstate = JNI_FALSE; // 纪录java层RemonitoringFileInfo相关对象是否正常获取
    
typedef enum _GET_JNIENV_STATUS{
    GET_FAIL = 0,
    GET_SUCCES_NOATTACH,
    GET_SUCCES_ATTCH,
}Get_JNIEnv_Status;

// 获取JNIInv
static Get_JNIEnv_Status getJNIEnv(JNIEnv* &env)
{
    Get_JNIEnv_Status GetStatus = GET_FAIL;  
    int status = myVm->GetEnv((void **) &env, JNI_VERSION_1_4);  
 
    if(status < 0) {
        status = myVm->AttachCurrentThread(&env, NULL);  
        if(status < 0) {  
            return GetStatus;  
        }  
        GetStatus = GET_SUCCES_ATTCH;  
    }
    else
    {
        GetStatus = GET_SUCCES_NOATTACH;
    }
    return GetStatus;
}

// 增加异常处理的回调
jvalue JNU_CallMethodByName(JNIEnv *env,
     jobject obj,
     jmethodID mid,
     const char returnType, va_list args)
{
     //va_list args;
     jclass clazz;
     jvalue result;
     if (env->EnsureLocalCapacity(2) == JNI_OK) {
        clazz = env->GetObjectClass(obj);
        if (mid) {
            /* skip over argument types to find out the
            return type */
            //va_start(args, returnType);
            //int t = va_arg(args, int);
            //LOGE("JNU_CallMethodByName -2 t = %d\n", t);
            //va_end(args);
            //va_start(args, returnType);
            switch (returnType) {
                case 'V':
                    env->CallVoidMethodV(obj, mid, args);
                    break;
                case '[':
                case 'L':
                    result.l = env->CallObjectMethodV(obj, mid, args);
                    break;
                case 'Z':
                    result.z = env->CallBooleanMethodV(obj, mid, args);
                    break;
                case 'B':
                    result.b = env->CallByteMethodV(obj, mid, args);
                    break;
                case 'C':
                    result.c = env->CallCharMethodV(obj, mid, args);
                    break;
                case 'S':
                    result.s = env->CallShortMethodV(obj, mid, args);
                    break;
                case 'I':
                    result.i = env->CallIntMethodV(obj, mid, args);
                    break;
                case 'J':
                    result.j = env->CallLongMethodV(obj, mid, args);
                break;
                case 'F':
                    result.f = env->CallFloatMethodV(obj, mid, args);
                    break;
                case 'D':
                    result.d = env->CallDoubleMethodV(obj, mid, args);
                    break;
                default:
                    env->FatalError("illegal descriptor");
            }
            va_end(args);
        }
        env->DeleteLocalRef(clazz);
    }
    if(env->ExceptionCheck())
    {
        env->ExceptionClear();
    }
    return result;
}

// 返回值为空的回调
jvalue JNU_CallVoidMethodByName(JNIEnv *env,
     jobject obj,
     jmethodID mid, ...)
{
    jvalue value;
    va_list args;
    va_start(args, mid);
    value = JNU_CallMethodByName(env, obj, mid, 'V', args);
    va_end(args);
    return value;
}

// 返回异常
void JNU_ThrowByName(JNIEnv* env, const char* name, const char *msg)
{
    jclass cls = env->FindClass(name);
    if(cls != NULL)
    {
        env->ThrowNew(cls, msg);
        env->DeleteLocalRef(cls);
    }
}

static void CallbackStartNetwork()
{
    LOGE("150331 - CallbackStartNetwork - 1");
    if (Network_Callback == NULL)
        return;
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    if(GetStatus == GET_FAIL)
    {
        return ;
    }
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callStartNetwork);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackCloseNetwork()
{
    LOGE("150331 - CallbackCloseNetwork - 1");
    if (Network_Callback == NULL)
        return;
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    if(GetStatus == GET_FAIL)
    {
        return ;
    }
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callCloseNetWork);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }    
}


static void CallbackCancelAlarmInfo(char* pszDevID, char* pszGuid)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    jstring jstrGuid = env->NewStringUTF(pszGuid);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackCancelAlarmInfo, jstrDevID, jstrGuid);
    env->DeleteLocalRef(jstrDevID);
    env->DeleteLocalRef(jstrGuid);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackVehicleStatus(char* pszDevID, char* pszGPSInfo)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    jstring jstrGPSInfo = env->NewStringUTF(pszGPSInfo);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackVehicleStatus, jstrDevID, jstrGPSInfo);
    env->DeleteLocalRef(jstrDevID);
    env->DeleteLocalRef(jstrGPSInfo);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}


static void CallbackGetDeviceStatus(Device_StatusInfo deviceStatusArray[], int length)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    if(Network_Callback == NULL || !jbdevicestatusinfostate)
    {
        return ;
    }
    else
    {
        jobjectArray jdeviceStatusInfoArray= env->NewObjectArray(length, jclassDeviceStatusInfo, 0);
        for(int i = 0; i < length; i++)
        {
            jobject deviceStatusInfoObject= env->NewObject(jclassDeviceStatusInfo, devicestatusinfofields.jmethodIDinit);
            jstring jstr = env->NewStringUTF(deviceStatusArray[i].pszDevID);
            env->SetObjectField(deviceStatusInfoObject, devicestatusinfofields.jfieldIDstrDevId, jstr);
            env->SetIntField(deviceStatusInfoObject, devicestatusinfofields.jfieldIDnState, deviceStatusArray[i].deviceStatus);
            env->SetObjectArrayElement(jdeviceStatusInfoArray, i, deviceStatusInfoObject);
            env->DeleteLocalRef(deviceStatusInfoObject);
        }
        //env->CallVoidMethod (Network_Callback, fields.callbackGetDeviceStatus, nState, jdeviceStatusInfoArray, length);
        JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackGetDeviceStatus, jdeviceStatusInfoArray, length);
        env->DeleteLocalRef(jdeviceStatusInfoArray);
    }
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackStartRealMonitorVideoStream( char* pszDevID, char* pszPlayurl)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    jstring jstrPlayurl = env->NewStringUTF(pszPlayurl);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackStartRealMonitorVideoStream, jstrDevID, jstrPlayurl);
    env->DeleteLocalRef(jstrDevID);
    env->DeleteLocalRef(jstrPlayurl);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackStopRealMonitorVideoStream(char* pszDevID)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackStopRealMonitorVideoStream, jstrDevID);
    env->DeleteLocalRef(jstrDevID);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackDownloadVideo(char* pszDevID, char* pszFileName, int nProgress,char* ResourceID,char* lon,char* lat)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    jstring jstrFileName = env->NewStringUTF(pszFileName);
    jstring jstrResourceID = env->NewStringUTF(ResourceID);
    jstring jstrlon = env->NewStringUTF(lon);
    jstring jstrlat= env->NewStringUTF(lat);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackDownloadVideo, jstrDevID, jstrFileName, nProgress,jstrResourceID,jstrlon,jstrlat);
    env->DeleteLocalRef(jstrDevID);
    env->DeleteLocalRef(jstrFileName);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackException(int exceptionType, int exceptionReason, char* pszParam1)
{
    LOGE("150331 - CallbackException - 1");
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrParam1 = env->NewStringUTF(pszParam1);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackException, exceptionType, exceptionReason, jstrParam1);
    env->DeleteLocalRef(jstrParam1);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackAlarmInfo(char* pszDevID, char* pszGuid, short AlarmType, char* pszAlarmTime, char* pszfileSize, char* pszfileName)
{
    LOGE("14112820 - CallbackAlarmInfo - 1");
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    jstring jstrGuid = env->NewStringUTF(pszGuid);
    jstring jstrAlarmTime = env->NewStringUTF(pszAlarmTime);
    jstring jstrfileSize = env->NewStringUTF(pszfileSize);
    jstring jstrfileName = env->NewStringUTF(pszfileName);
    LOGE("14112820 - CallbackAlarmInfo - 2");
    //env->CallVoidMethod (Network_Callback, fields.callbackAlarmInfo, jstrDevID, jstrGuid, AlarmType, jstrAlarmTime);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackAlarmInfo, jstrDevID, jstrGuid, AlarmType, jstrAlarmTime, jstrfileSize, jstrfileName);
    env->DeleteLocalRef(jstrDevID);
    env->DeleteLocalRef(jstrGuid);
    env->DeleteLocalRef(jstrAlarmTime);
    env->DeleteLocalRef(jstrfileSize);
    env->DeleteLocalRef(jstrfileName);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
    LOGE("14112820 - CallbackAlarmInfo - 3");
}

static void CallbackFailue(FunctionSymbol functionSymbol, int reason, char* param1, char* param2)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrparam1 = env->NewStringUTF(param1);
    jstring jstrparam2 = env->NewStringUTF(param2);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackFailue, functionSymbol, reason, jstrparam1, jstrparam2);
    env->DeleteLocalRef(jstrparam1);
    env->DeleteLocalRef(jstrparam2);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackOvertime(FunctionSymbol functionSymbol, int overtimeReason, char* pszParam1, char* pszParam2)
{
    LOGE("150331 - CallbackOvertime - 1");
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrparam1 = env->NewStringUTF(pszParam1);
    jstring jstrparam2 = env->NewStringUTF(pszParam2);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackOvertime, functionSymbol, overtimeReason, jstrparam1, jstrparam2);
    env->DeleteLocalRef(jstrparam1);
    env->DeleteLocalRef(jstrparam2);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackUploadAlarmVideoCompletely(char* pszDevID, char* pszGuid, char* pszPlayurl)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    jstring jstrGuid = env->NewStringUTF(pszGuid);
    jstring jstrPlayurl = env->NewStringUTF(pszPlayurl);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackUploadAlarmVideoCompletely, jstrDevID, jstrGuid, jstrPlayurl);
    env->DeleteLocalRef(jstrDevID);
    env->DeleteLocalRef(jstrGuid);
    env->DeleteLocalRef(jstrPlayurl);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackAlarmHistory(Alarm_Record alarmRecord[], int length, int whichPage)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    if(Network_Callback == NULL || !jbalarmrecordstate)
    {
        return ;
    }
    else
    {
        jobjectArray jAlarmRecordArray= env->NewObjectArray(length, jclassAlarmRecord, 0);
        for(int i = 0; i < length; i++)
        {
            jobject alarmRecordObject= env->NewObject(jclassAlarmRecord, alarmrecordfields.jmethodIDinit);
            jstring jstrDevID = env->NewStringUTF(alarmRecord[i].pszDevID);
            jstring jstrAlarmTime = env->NewStringUTF(alarmRecord[i].pszAlarmTime);
            jstring jstrFileName = env->NewStringUTF(alarmRecord[i].pszFileName);
            jstring jstrFileSize = env->NewStringUTF(alarmRecord[i].pszFileSize);
            jstring jstrPlayUrl = env->NewStringUTF(alarmRecord[i].pszPlayUrl);
            env->SetObjectField(alarmRecordObject, alarmrecordfields.jfieldIDstrDevId, jstrDevID);
            env->SetShortField(alarmRecordObject, alarmrecordfields.jfieldIDsalarmType, alarmRecord[i].alarmType);
            env->SetObjectField(alarmRecordObject, alarmrecordfields.jfieldIDstrAlarmTime, jstrAlarmTime);
            env->SetObjectField(alarmRecordObject, alarmrecordfields.jfieldIDstrFileName, jstrFileName);
            env->SetObjectField(alarmRecordObject, alarmrecordfields.jfieldIDFileSize, jstrFileSize);
            env->SetObjectField(alarmRecordObject, alarmrecordfields.jfieldIDPlayUrl, jstrPlayUrl);
            env->SetObjectArrayElement(jAlarmRecordArray, i, alarmRecordObject);
            env->DeleteLocalRef(alarmRecordObject);
        }
        JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackAlarmHistory, jAlarmRecordArray, length, whichPage);
        env->DeleteLocalRef(jAlarmRecordArray);
    }
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackUploadFile(char* fileName, int progress)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrfileName = env->NewStringUTF(fileName);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackUploadFile, jstrfileName, progress);
    env->DeleteLocalRef(jstrfileName);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackOpenGpsInfo(char* pszDevID)
{
    LOGE("150401 -- CallbackOpenGpsInfo");
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackOpenGpsInfo, jstrDevID);
    env->DeleteLocalRef(jstrDevID);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackSnapShot(char* pszDevID)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackSnapShot, jstrDevID);
    env->DeleteLocalRef(jstrDevID);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackCloseGpsInfo(char* pszDevID)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackCloseGpsInfo, jstrDevID);
    env->DeleteLocalRef(jstrDevID);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static void CallbackDrivingFile(char* pszDevID)
{
    JNIEnv *env;
    Get_JNIEnv_Status GetStatus = getJNIEnv(env);
    jstring jstrDevID = env->NewStringUTF(pszDevID);
    JNU_CallVoidMethodByName(env, Network_Callback, fields.callbackDrivingFile, jstrDevID);
    env->DeleteLocalRef(jstrDevID);
    if(GetStatus == GET_SUCCES_ATTCH)
    {
        myVm->DetachCurrentThread();
    }
}

static int native_init(JNIEnv *env, jclass clazz)
{
    GetNetworkCallback()->m_CallbackStartNetwork = CallbackStartNetwork;
    GetNetworkCallback()->m_CallbackCloseNetwork = CallbackCloseNetwork;
    GetNetworkCallback()->m_CallbackCancelAlarmInfo = CallbackCancelAlarmInfo;
    GetNetworkCallback()->m_CallbackGetDeviceStatus = CallbackGetDeviceStatus;
    GetNetworkCallback()->m_CallbackGetVehicleStatus = CallbackVehicleStatus;
    GetNetworkCallback()->m_CallbackStartRealMonitorVideoStream = CallbackStartRealMonitorVideoStream;
    GetNetworkCallback()->m_CallbackStopRealMonitorVideoStream = CallbackStopRealMonitorVideoStream;
    GetNetworkCallback()->m_CallbackDownloadVideo = CallbackDownloadVideo;
    GetNetworkCallback()->m_CallbackException = CallbackException;
    GetNetworkCallback()->m_CallbackAlarmInfo = CallbackAlarmInfo;
    GetNetworkCallback()->m_CallbackFailue = CallbackFailue;
    GetNetworkCallback()->m_CallbackOvertime = CallbackOvertime;
    GetNetworkCallback()->m_CallbackUploadAlarmVideoCompletely = CallbackUploadAlarmVideoCompletely;
    GetNetworkCallback()->m_CallbackAlarmHistory = CallbackAlarmHistory;
    GetNetworkCallback()->m_CallbackUploadPicture = CallbackUploadFile;
    GetNetworkCallback()->m_CallbackOpenGpsInfo = CallbackOpenGpsInfo;
    GetNetworkCallback()->m_CallbackSnapShot = CallbackSnapShot;
    GetNetworkCallback()->m_CallbackCloseGpsInfo = CallbackCloseGpsInfo;
    GetNetworkCallback()->m_CallbackDrivingFile = CallbackDrivingFile;
}

static void CallStartNetwork(JNIEnv *env, jobject object, jstring strClientIDNO, jchar cTerminalFlag, jstring strServerIP, jshort usPort)
{    
    LOGE("-------jni StartNetwork-----");
    const char* p_szClientIDNO = env->GetStringUTFChars(strClientIDNO, 0);
    if(p_szClientIDNO == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    const char* p_szServerIP = env->GetStringUTFChars(strServerIP, 0);
    if(p_szServerIP == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        env->ReleaseStringUTFChars(strClientIDNO, p_szClientIDNO);
        return ;
    }
    StartNetwork((char*)p_szClientIDNO, cTerminalFlag, (char*)p_szServerIP, usPort);
    env->ReleaseStringUTFChars(strClientIDNO, p_szClientIDNO);
    env->ReleaseStringUTFChars(strServerIP, p_szServerIP);
}

static void CallCloseNetwork(JNIEnv *env, jobject object)
{
    LOGE("14112915 - CallCloseNetwork");
    CloseNetwork();
}

static void CallCancelAlarmInfo(JNIEnv *env, jobject object, jstring strDevID, jstring strGuid)
{
    LOGE("14112915 - CallCancelAlarmInfo");
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    const char* p_szGuid = env->GetStringUTFChars(strGuid, 0);
    if(p_szGuid == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        env->ReleaseStringUTFChars(strDevID, p_szDevID);
        return ;
    }
    CancelAlarmInfo((char*)p_szDevID, (char*)p_szGuid);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
    env->ReleaseStringUTFChars(strGuid, p_szGuid);
}

static void CallGetDeviceStatus(JNIEnv *env, jobject object)
{
    LOGE("14112915 - CallGetDeviceStatus");
    GetDeviceStatus();
}

static void CallGetVehicleStatus(JNIEnv *env, jobject object, jstring strDevID)
{
    LOGE("14112915 - CallGetVehicleStatus");
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    LOGE("CallGetVehicleStatus 1 -- p_szDevID = %s", p_szDevID);
    GetVehicleStatus((char*)p_szDevID);
    LOGE("CallGetVehicleStatus 2 -- p_szDevID = %s", p_szDevID);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
}

static void CallRealtimeMonitorVideoStream(JNIEnv *env, jobject object, jstring strDevID, jint startOrStop)
{
    LOGE("14112915 - CallRealtimeMonitorVideoStream");
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    LOGE("CallRealtimeMonitorVideoStream 1 -- p_szDevID = %s", p_szDevID);
    RealtimeMonitorVideoStream((char*)p_szDevID, startOrStop);
    LOGE("CallRealtimeMonitorVideoStream 2 -- p_szDevID = %s", p_szDevID);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
}

static void CallGetAlarmRecord(JNIEnv *env, jobject object, jstring strDevID, jint nYear,jint nMonth,jint nDay,jint nHour,jint nMin,jint nSecond,jint nEndTime,jint nRecType,jint nChannel)
{
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    GetAlarmRecord((char*)p_szDevID, nYear, nMonth, nDay, nHour, nMin, nSecond, nEndTime, nRecType, nChannel);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
}

static void CallDownloadVideo(JNIEnv *env, jobject object, jstring strDevID,jint nOffset,jint nStartOffset,jint nEndOffset,jstring strfilename)
{
    LOGE("14112915 - CallDownloadVideo");
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    const char* p_szfilename = env->GetStringUTFChars(strfilename, 0);
    if(p_szfilename == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        env->ReleaseStringUTFChars(strDevID, p_szDevID);
        return ;
    }
    DownloadVideo((char*)p_szDevID, nOffset, nStartOffset, nEndOffset, (char*)p_szfilename);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
    env->ReleaseStringUTFChars(strfilename, p_szfilename);
}

static void CallOpenGPSInfo(JNIEnv *env, jobject object, jstring strDevID)
{
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    OpenGPSInfo((char*)p_szDevID);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
}

static void CallCloseGPSInfo(JNIEnv *env, jobject object, jstring strDevID)
{
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    CloseGPSInfo((char*)p_szDevID);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
}

static void CallSnapShotFile(JNIEnv *env, jobject object, jstring strDevID)
{
    const char* p_szDevID = env->GetStringUTFChars(strDevID, 0);
    if(p_szDevID == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    SnapShotFile((char*)p_szDevID);
    env->ReleaseStringUTFChars(strDevID, p_szDevID);
}

static void CallUploadFile(JNIEnv *env, jobject object, jint nOffset,jint nStartOffset,jint nEndOffset,jstring filename,jstring longitude,jstring latitude,jstring time)
{
    const char* p_szfilename = env->GetStringUTFChars(filename, 0);
    if(p_szfilename == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    char* p_szlongitude;
    if(longitude != NULL)
    {
        p_szlongitude = (char*)env->GetStringUTFChars(longitude, 0);
        if(p_szlongitude == NULL)
        {
            jthrowable jthrowableException =  env->ExceptionOccurred();
            env->Throw(jthrowableException);
            return ;
        }
    }
    else
    {
        p_szlongitude = NULL;
    }
    char* p_szlatitude;
    if(latitude != NULL)
    {
        p_szlatitude = (char*)env->GetStringUTFChars(latitude, 0);
        if(p_szlatitude == NULL)
        {
            jthrowable jthrowableException =  env->ExceptionOccurred();
            env->Throw(jthrowableException);
            return ;
        }
    }
    else
    {
        p_szlatitude = NULL;
    }
    const char* p_sztime = env->GetStringUTFChars(time, 0);
    if(p_sztime == NULL)
    {
        jthrowable jthrowableException =  env->ExceptionOccurred();
        env->Throw(jthrowableException);
        return ;
    }
    UploadFile(nOffset, nStartOffset, nEndOffset, (char*)p_szfilename, (char*)p_szlongitude, (char*)p_szlatitude, (char*)p_sztime);
    env->ReleaseStringUTFChars(filename, p_szfilename);
    if(p_szlongitude != NULL)
    {
        env->ReleaseStringUTFChars(longitude, p_szlongitude);
    }
    if(p_szlongitude != NULL)
    {
        env->ReleaseStringUTFChars(latitude, p_szlatitude);
    }
    env->ReleaseStringUTFChars(time, p_sztime);
}

static void CallsetCallbackObject(JNIEnv *env, jobject thiz, jobject callback)
{
    Network_Callback = env->NewGlobalRef(callback);
    jclass cls = env->GetObjectClass (Network_Callback);
    if(cls != NULL)
    {
        fields.callStartNetwork = env->GetMethodID (cls, "callStartNetwork", "()V");
        fields.callCloseNetWork = env->GetMethodID (cls, "callCloseNetwork", "()V");
        fields.callbackCancelAlarmInfo = env->GetMethodID (cls, "callbackCancelAlarmInfo", "(Ljava/lang/String;Ljava/lang/String;)V");
        fields.callbackGetDeviceStatus = env->GetMethodID (cls, "callbackGetDeviceStatus", "([Lcom/apical/aiproforcloud/networklibrary/DeviceStatusInfo;I)V");
        fields.callbackVehicleStatus = env->GetMethodID (cls, "callbackVehicleStatus", "(Ljava/lang/String;Ljava/lang/String;)V");
        fields.callbackStartRealMonitorVideoStream = env->GetMethodID (cls, "callbackStartRealMonitorVideoStream", "(Ljava/lang/String;Ljava/lang/String;)V");
        fields.callbackStopRealMonitorVideoStream = env->GetMethodID (cls, "callbackStopRealMonitorVideoStream", "(Ljava/lang/String;)V");
        fields.callbackDownloadVideo = env->GetMethodID (cls, "callbackDownloadVideo", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
        fields.callbackException = env->GetMethodID (cls, "callbackException", "(IILjava/lang/String;)V");
        fields.callbackAlarmInfo = env->GetMethodID (cls, "callbackAlarmInfo", "(Ljava/lang/String;Ljava/lang/String;SLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
        fields.callbackFailue = env->GetMethodID(cls, "callbackFailue", "(IILjava/lang/String;Ljava/lang/String;)V");
        fields.callbackOvertime = env->GetMethodID(cls, "callbackOvertime", "(IILjava/lang/String;Ljava/lang/String;)V");
        fields.callbackAlarmHistory = env->GetMethodID(cls, "callbackAlarmHistory", "([Lcom/apical/aiproforcloud/networklibrary/AlarmRecord;II)V");
        fields.callbackUploadFile = env->GetMethodID(cls, "callbackUploadFile", "(Ljava/lang/String;I)V");
        fields.callbackOpenGpsInfo = env->GetMethodID(cls, "callbackOpenGpsInfo", "(Ljava/lang/String;)V");
        fields.callbackSnapShot = env->GetMethodID(cls, "callbackSnapShot", "(Ljava/lang/String;)V");
        fields.callbackCloseGpsInfo = env->GetMethodID(cls, "callbackCloseGpsInfo", "(Ljava/lang/String;)V");
        fields.callbackDrivingFile = env->GetMethodID(cls, "callbackDrivingFile", "(Ljava/lang/String;)V");
        fields.callbackUploadAlarmVideoCompletely = env->GetMethodID(cls, "callbackUploadAlarmVideoCompletely", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
    }
    jclassDeviceStatusInfo = (jclass)env->NewGlobalRef(env->FindClass(kClassNameDeviceStatus));
    if(jclassDeviceStatusInfo != NULL)
    {
        devicestatusinfofields.jfieldIDstrDevId = env->GetFieldID(jclassDeviceStatusInfo,"strDevID","Ljava/lang/String;");
        devicestatusinfofields.jfieldIDnState = env->GetFieldID(jclassDeviceStatusInfo,"nState","I");
        devicestatusinfofields.jmethodIDinit = env->GetMethodID(jclassDeviceStatusInfo, "<init>", "()V");
    }
    if(jclassDeviceStatusInfo != NULL && devicestatusinfofields.jfieldIDstrDevId != NULL
    && devicestatusinfofields.jfieldIDnState != NULL && devicestatusinfofields.jmethodIDinit != NULL)
    {
        jbdevicestatusinfostate = JNI_TRUE;
    }
    else
    {
        JNU_ThrowByName(env, kClassNameOutOfNullPointerException, devicestatusinfoexceptiondescript);
    }
/*    jclassRemonitoringFileInfo = (jclass)env->NewGlobalRef(env->FindClass(kClassNameRemonitoringFileInfo));
    if(jclassRemonitoringFileInfo != NULL)
    {
        remonitoringfileinfofields.jfieldIDstrFileName = env->GetFieldID(jclassRemonitoringFileInfo,"strFileName","Ljava/lang/String;");
        remonitoringfileinfofields.jfieldIDstrFileTime = env->GetFieldID(jclassRemonitoringFileInfo,"strFileTime","Ljava/lang/String;");
        remonitoringfileinfofields.jfieldIDnCanPlay = env->GetFieldID(jclassRemonitoringFileInfo,"nCanPlay","I");
        remonitoringfileinfofields.jmethodIDinit = env->GetMethodID(jclassRemonitoringFileInfo, "<init>", "()V");
    }
    LOGE("150330 - CallsetCallbackObject - 9");
    if(jclassRemonitoringFileInfo != NULL && remonitoringfileinfofields.jfieldIDstrFileName != NULL &&
        remonitoringfileinfofields.jfieldIDstrFileTime != NULL && remonitoringfileinfofields.jfieldIDnCanPlay != NULL
        && remonitoringfileinfofields.jmethodIDinit != NULL)
    {
        jbremonitoringfileinfostate = JNI_TRUE;
    }
    else
    {
        JNU_ThrowByName(env, kClassNameOutOfNullPointerException, remonitoringfileinfoexceptiondescript);
    }
    */
    jclassAlarmRecord = (jclass)env->NewGlobalRef(env->FindClass(kClassNameAlarmRecord));    
    if(jclassAlarmRecord != NULL)
    {
        alarmrecordfields.jfieldIDstrDevId = env->GetFieldID(jclassAlarmRecord,"strDevID","Ljava/lang/String;");
        alarmrecordfields.jfieldIDsalarmType = env->GetFieldID(jclassAlarmRecord,"alarmType","S");
        alarmrecordfields.jfieldIDstrAlarmTime = env->GetFieldID(jclassAlarmRecord,"strAlarmTime","Ljava/lang/String;");
        alarmrecordfields.jfieldIDstrFileName = env->GetFieldID(jclassAlarmRecord,"strFileName","Ljava/lang/String;");
        alarmrecordfields.jfieldIDFileSize = env->GetFieldID(jclassAlarmRecord,"strFileSize","Ljava/lang/String;");
        alarmrecordfields.jfieldIDPlayUrl = env->GetFieldID(jclassAlarmRecord,"strPlayUrl","Ljava/lang/String;");
        alarmrecordfields.jmethodIDinit = env->GetMethodID(jclassAlarmRecord, "<init>", "()V");
    }    
    if(jclassAlarmRecord != NULL && alarmrecordfields.jfieldIDstrDevId != NULL &&
        alarmrecordfields.jfieldIDsalarmType != NULL && alarmrecordfields.jfieldIDstrFileName != NULL &&
        alarmrecordfields.jfieldIDsalarmType != NULL && alarmrecordfields.jfieldIDFileSize != NULL
        &&alarmrecordfields.jfieldIDPlayUrl != NULL && alarmrecordfields.jmethodIDinit != NULL)
    {
        jbalarmrecordstate = JNI_TRUE;
    }
    else
    {
        JNU_ThrowByName(env, kClassNameOutOfNullPointerException, alarmrecordexceptiondescript);
    }
    env->DeleteLocalRef(cls);
}

static void Release(JNIEnv *env, jobject thiz)
{
    if (Network_Callback != NULL)
        env->DeleteGlobalRef(Network_Callback);
    if(jclassDeviceStatusInfo != NULL)
    {
        env->DeleteGlobalRef(jclassDeviceStatusInfo);
    }
    if(jclassRemonitoringFileInfo != NULL)
    {
        env->DeleteGlobalRef(jclassRemonitoringFileInfo);
    }
    Network_Callback = NULL;    
}

static const JNINativeMethod gMethods[] = {
{"native_init", "()V", (void*)native_init},
{"startNetwork", "(Ljava/lang/String;CLjava/lang/String;S)V", (void*)CallStartNetwork},
{"closeNetwork", "()V", (void*)CallCloseNetwork},
{"cancelAlarmInfo", "(Ljava/lang/String;Ljava/lang/String;)V", (void*)CallCancelAlarmInfo},
{"getDeviceStatus", "()V", (void*)CallGetDeviceStatus},
{"getVehicleStatus", "(Ljava/lang/String;)V", (void*)CallGetVehicleStatus},
{"realtimeMonitorVideoStream", "(Ljava/lang/String;I)V", (void*)CallRealtimeMonitorVideoStream},
{"getAlarmRecord", "(Ljava/lang/String;IIIIIIIII)V", (void*)CallGetAlarmRecord},
{"downloadVideo", "(Ljava/lang/String;IIILjava/lang/String;)V", (void*)CallDownloadVideo},
{"openGpsInfo", "(Ljava/lang/String;)V", (void*)CallOpenGPSInfo},
{"closeGpsInfo", "(Ljava/lang/String;)V", (void*)CallCloseGPSInfo},
{"snapShot", "(Ljava/lang/String;)V", (void*)CallSnapShotFile},
{"uploadFile", "(IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",(void*)CallUploadFile},
{"setCallbackObject", "(Lcom/apical/aiproforcloud/networklibrary/Callback;)V", (void*)CallsetCallbackObject},
{"release", "()V", (void*)Release},
};

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void *reserved)
{
LOGE("EventHandler: JNI_OnLoad ");
JNIEnv* env = NULL;
myVm = vm;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
  return -1;
jclass clazz;

clazz = env->FindClass(kClassNameNetwork);

if(clazz == NULL)
{
  return -1;
}

if(env->RegisterNatives(clazz,gMethods, sizeof(gMethods)/sizeof(gMethods[0]))!= JNI_OK)
{
  return -1;
}
return JNI_VERSION_1_4;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值