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 + -
显示快捷键?