packerext.cpp

来自「java调用ie浏览器demo源码,可以用在windows或者linux」· C++ 代码 · 共 559 行 · 第 1/2 页

CPP
559
字号
    jclass,
    jlong isNative)
{
    ((CUnpackerExt *)isNative)->close(env);
    delete (CUnpackerExt *)isNative;
}

/* Initialize the Java VM instance variable when the library is 
   first loaded */
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    jvm = vm;
    return JNI_VERSION_1_2;
}

}; /* extern "C" */


////////////////////////////////
// class CPackerExt
jclass    CPackerExt::ms_jcidNativePackedOutputStream = NULL;
jmethodID CPackerExt::ms_jcidNativePackedOutputStream_getEntrySuffix = NULL;//String getEntrySuffix(String)
jmethodID CPackerExt::ms_jcidNativePackedOutputStream_getEntrySuffixStub = NULL;//String getEntrySuffixStub()

jclass    CPackerExt::ms_jcidOutputStream = NULL;

jmethodID CPackerExt::ms_jcidOutputStream_write = NULL;//()I: int read()

jmethodID CPackerExt::ms_jcidOutputStream_writeBytes = NULL; //([BII)I: int read(byte[], int, int)



jclass    CPackerExt::ms_jcidZipEntry = NULL;

jfieldID  CPackerExt::ms_jcidZipEntry_name = NULL;  //String

jfieldID  CPackerExt::ms_jcidZipEntry_time = NULL;  //long

jfieldID  CPackerExt::ms_jcidZipEntry_crc = NULL;   //long

jfieldID  CPackerExt::ms_jcidZipEntry_size = NULL;  //long

jfieldID  CPackerExt::ms_jcidZipEntry_csize = NULL; //long

jfieldID  CPackerExt::ms_jcidZipEntry_method = NULL;//int

jfieldID  CPackerExt::ms_jcidZipEntry_comment = NULL;//String



void CPackerExt::initIDs(

    JNIEnv *env, 

    jclass jcidNativePackedOutputStream)

{

    ms_jcidNativePackedOutputStream = (jclass)makeGlobal(env, jcidNativePackedOutputStream);
    ms_jcidNativePackedOutputStream_getEntrySuffix = env->GetMethodID(
        ms_jcidNativePackedOutputStream, "getEntrySuffix", "(Ljava/lang/String;)Ljava/lang/String;");
    ms_jcidNativePackedOutputStream_getEntrySuffixStub  = env->GetMethodID(
        ms_jcidNativePackedOutputStream, "getEntrySuffixStub", "()Ljava/lang/String;");


    ms_jcidOutputStream = getGlobalJavaClazz(

        env,

        "java/io/OutputStream"

    );

    ms_jcidOutputStream_write = env->GetMethodID(ms_jcidOutputStream, "write", "(I)V");

    ms_jcidOutputStream_writeBytes = env->GetMethodID(ms_jcidOutputStream, "write", "([BII)V");



    ms_jcidZipEntry = getGlobalJavaClazz(

        env,

        "java/util/zip/ZipEntry"

    );    

    ms_jcidZipEntry_name = env->GetFieldID(ms_jcidZipEntry, "name", "Ljava/lang/String;");

    ms_jcidZipEntry_time = env->GetFieldID(ms_jcidZipEntry, "time", "J");

    ms_jcidZipEntry_crc = env->GetFieldID(ms_jcidZipEntry, "crc", "J");

    ms_jcidZipEntry_size = env->GetFieldID(ms_jcidZipEntry, "size", "J");

    ms_jcidZipEntry_csize = env->GetFieldID(ms_jcidZipEntry, "csize", "J");

    ms_jcidZipEntry_method = env->GetFieldID(ms_jcidZipEntry, "method", "I");        

    ms_jcidZipEntry_comment = env->GetFieldID(ms_jcidZipEntry, "comment", "Ljava/lang/String;");        

}



CPackerExt::CPackerExt(

    JNIEnv *env, 

    jobject othis,    

    jobject os,

    jlong   hint

){

    m_hint = hint;

    m_ze = NULL;

    m_os = makeGlobal(env, os);

    m_this = makeGlobal(env, othis);

    m_pEntryName = NULL;

    m_oflag = ACCESS_READ | ACCESS_WRITE | ACCESS_EXECUTE;

    m_osize = 0;

    m_dos_time = -1;//unknown

    m_crc = -1;//unknown

    m_compressionLevel = 9;//max

    m_compressionType = 0;//store

}



void CPackerExt::close(JNIEnv *env)

{

    closeEntry(env, -1); //alarm termination, crc not defined



    releaseGlobal(env, m_this);

    m_this = NULL;



    releaseGlobal(env, m_os);

    m_os = NULL;

}



void CPackerExt::finish(JNIEnv *env)

{

    //copy is synchronous, so do nothing

}



bool CPackerExt::checkValid(JNIEnv *env)

{

    return true;

}



CPackerExt::~CPackerExt()

{

    free(m_pEntryName);

    if(NULL != m_os || NULL != m_this) {

        //alarm message

    }   

}

void CPackerExt::UpdateEntryInfo(JNIEnv *env)

{

    if(NULL != m_ze){

        free(m_pEntryName);

        m_pEntryName = getName(env, m_ze);

        if(NULL!=m_pEntryName){

            m_dos_time = getTime(env, m_ze);

            m_osize = getSize(env, m_ze);

            m_compressionType = getMethod(env, m_ze);

        }

    }

}

void CPackerExt::putNextEntry(

    JNIEnv *env, 

    jobject ze, 

    jint level)

{

    m_compressionLevel = level;

    m_ze = makeGlobal(env, ze);

    UpdateEntryInfo(env);

    //STRACE1(_T("Name: %s Size: %d Date: %d"), m_pEntryName, m_dos_time, m_osize);

}



jlong CPackerExt::closeEntry(

    JNIEnv *env,

    jlong crc)

{

    m_crc = crc;

    releaseGlobal(env, m_ze);

    m_ze = NULL;



    free(m_pEntryName);

    m_pEntryName = NULL;



    return m_osize;

}



LPSTR CPackerExt::getStringField(

    JNIEnv *env, 

    jobject ze, 

    jfieldID id)

{ 

    LPSTR ret = NULL;

    jstring js = (jstring)env->GetObjectField(ze, id);

    if( NULL!=js ) {

        LPCSTR pBuf = env->GetStringUTFChars(js, NULL);

        if( NULL != pBuf){

            ret = _strdup(pBuf);

            env->ReleaseStringUTFChars(js, pBuf);

        }    

        env->DeleteLocalRef(js);

    }

    return ret;

}



LPSTR CPackerExt::getEntrySuffixStub(JNIEnv *env)

{ 

    LPSTR ret = NULL;

    jstring js = (jstring)env->CallObjectMethod(

        m_this, 

        ms_jcidNativePackedOutputStream_getEntrySuffixStub);



    if( NULL!=js ) {

        LPCSTR pBuf = env->GetStringUTFChars(js, NULL);

        if( NULL != pBuf){

            ret = _strdup(pBuf);

            env->ReleaseStringUTFChars(js, pBuf);

        }    

        env->DeleteLocalRef(js);

    }

    return ret;

}





// native section

extern "C" {

                                            

JNIEXPORT void JNICALL Java_org_jdic_arc_NativePackedOutputStream_initIDs(
    JNIEnv* env, 
    jclass jcidNativePackedOutputStream)
{
    CPackerExt::initIDs(env, jcidNativePackedOutputStream);

}

//non-static!!!! 

JNIEXPORT jlong JNICALL Java_org_jdic_arc_NativePackedOutputStream_createNativeStream(
    JNIEnv* env, 
    jobject othis,
    jobject os,
    jint iFormat,
    jlong hint)
{
    CPackerExt *pPkg = NULL;
    switch(iFormat){
    case 0: //primitive copy
        pPkg = new CPackerExt(env, othis, os, hint);
        break;
    case 1: //cab
        pPkg = new CCabPacker(env, othis, os, hint);
        break;
    }
    return (jlong)pPkg;
}


JNIEXPORT void JNICALL Java_org_jdic_arc_NativePackedOutputStream_writeNativeBytes(
    JNIEnv* env, 
    jclass,
    jlong osNative, 
    jbyteArray buf, 
    jint off, 
    jint len)
{
    ((CPackerExt *)osNative)->writeNativeBytes(
        env,
        buf, 
        off, 
        len);
}

JNIEXPORT void JNICALL Java_org_jdic_arc_NativePackedOutputStream_putNextEntryNative(
    JNIEnv* env, 
    jclass,
    jlong osNative,
    jobject ze,
    jint level)
{
    ((CPackerExt *)osNative)->putNextEntry(env, ze, level);
}

JNIEXPORT jlong JNICALL Java_org_jdic_arc_NativePackedOutputStream_closeEntryNative(
    JNIEnv* env, 
    jclass,
    jlong osNative,
    jlong crc)
{
    return ((CPackerExt *)osNative)->closeEntry(env, crc);
}


JNIEXPORT void JNICALL Java_org_jdic_arc_NativePackedOutputStream_checkNativeValid(
    JNIEnv* env, 
    jclass,
    jlong osNative)
{
    ((CPackerExt *)osNative)->checkValid(env);
}

JNIEXPORT void JNICALL Java_org_jdic_arc_NativePackedOutputStream_finishNative(
    JNIEnv* env, 
    jclass,
    jlong osNative)
{
    ((CPackerExt *)osNative)->finish(env);
}
JNIEXPORT void JNICALL Java_org_jdic_arc_NativePackedOutputStream_closeNative(
    JNIEnv* env, 
    jclass,
    jlong osNative)
{
    ((CPackerExt *)osNative)->close(env);
    delete (CPackerExt *)osNative;
}

}; /* extern "C" */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?