⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java_string.cpp

📁 封装了C++调用Java功能的功能!JNI,javaVM
💻 CPP
字号:
// JAVA_String.cpp: implementation of the JAVA_String class.
//
//////////////////////////////////////////////////////////////////////
#include "../header/JAVA_String.h"
#include "../header/JAVA_VM.h"
#include <limits.h>
#include <Windows.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////



JAVA_String::JAVA_String()
{
	__init();
}


JAVA_String::~JAVA_String()
{
	__release();
}


JAVA_String::JAVA_String(const JAVA_String& _string)
{
	__init();			
	LPJTCHAR		__lpData = _string.m_lpData;
	_setdata(__lpData);
	JAVA_StringData * _lpStringData = _ToStringData(_getdata());
	_lpStringData->addRef();
}

JAVA_String::JAVA_String(const JNI_String& _string)
{
	JNI_Env *  __lpEnv = JAVA_VM::getInstance()->getEnv();
	const JNI_Char * __lpChar = __lpEnv->GetStringChars(_string,0);
	JNI_Int		__len = __lpEnv->GetStringLength(_string);  
	__init();
#ifdef  _UNICODE	
	__s_copy(__lpChar,__len);	
#else
	long __strLen = __len*2+1;
	__assign(__strLen );
	JAVA_StringData * _lpStringData = _ToStringData(_getdata());

	LPJTCHAR __lpBuffer = _lpStringData->data();
	int n = ::WideCharToMultiByte(CP_ACP, 0, __lpChar, __len, __lpBuffer,
		__strLen, NULL, NULL);

	__lpBuffer[n] = '\0';

	_lpStringData->setDataLength(n);

#endif
}


JAVA_String::JAVA_String(LPJTCHAR _lp)
{
	__init();
	__s_copy(_lp);
}


LPJTCHAR&   JAVA_String::_getdata() 
{
	return m_lpData;
}


void	   JAVA_String::_setdata(const LPJTCHAR _lp)
{
	m_lpData = _lp;
}

LPJTCHAR JAVA_String::getStringFromJni(JNI_Env* _lpEnv,JNI_String _jnistring)
{
	const JNI_Char * __lpChar = _lpEnv->GetStringChars(_jnistring,0); 
	
#ifdef _UNICODE 
	return const_cast<LPJTCHAR>(__lpChar);
#else
	
	return 0;

#endif
}


LPJTCHAR JAVA_String::getStringFromJni(JNI_String _jnistring)
{
	JNI_Env *  __lpEnv = JAVA_VM::getInstance()->getEnv();
	LPJTCHAR __lpChar = JAVA_String::getStringFromJni(__lpEnv,_jnistring); 
	return __lpChar;
}




/* ^_^ 
 *
 * Funtcion Type  :  Class JAVA_String Member Function
 * Funtcion Name  :  __release
 *   Return Type  :  
void	
 *
 *		No  Parameter
 *
 *   Note:
 *		 TODO
 *
 *	Create	:   
 *		Date			   Time				Author
 *	------------------------------------------------
 *   2006-3-28           15:33:20			XiaoWei
 */
void	JAVA_String::__release()
{
	JAVA_StringData::release(_getdata());
	__releaseJniString();
}


/* ^_^ 
 *
 * Funtcion Type  :  Class JAVA_String Member Function
 * Funtcion Name  :  __assign
 *   Return Type  :  void	
 *
 *	Parameter 1	: long _len
 *
 *   Note:
 *		 TODO
 *
 *	Create	:   
 *		Date			   Time				Author
 *	------------------------------------------------
 *   2006-3-28           15:33:38			XiaoWei
 */
void	JAVA_String::__assign(long _len)
{
	if (_len <= 0) {
		__init();
	}else{
		m_lpData = JAVA_StringData::assign(_len);
	}
}


void	JAVA_String::__assignAndCopy(LPJTCHAR _string)
{
	long __len = _strlen(_string);;
	if (__len <= 0) {
		__init();
	}else{
		m_lpData = JAVA_StringData::assign(__len);
		JAVA_StringData::string_copy(_getdata(),_string,__len);
		__setChange();
	}
}
/* ^_^ 
 *
 * Funtcion Type  :  Class JAVA_String Member Function
 * Funtcion Name  :  __init
 *   Return Type  :  void	
 *
 *		No  Parameter
 *
 *   Note:
 *		 内部调用
 *
 *	Create	:   
 *		Date			   Time				Author
 *	------------------------------------------------
 *   2006-3-28           15:26:50			XiaoWei
 */
void	JAVA_String::__init()
{
	m_lpData = (LPJTCHAR)&__defStringData;
	m_JniString  = JNI_NULL;
	m_isChange   = e_haschange;
}


void	JAVA_String::__s_copy(LPJCTCHAR _lp)
{
	JAVA_StringData * _lpStringData = _ToStringData(_getdata());
	_lpStringData->string_copy(_getdata(),_lp);
	__setChange();
}


void	JAVA_String::__s_copy(LPJCTCHAR _lp,long _l)
{
	JAVA_StringData * _lpStringData = _ToStringData(_getdata());
	_lpStringData->string_copy(_getdata(),_lp,_l);
	__setChange();
}



/* ^_^ 
 *
 * Funtcion Type  :  Class JAVA_String Member Function
 * Funtcion Name  :  getLocalString
 *   Return Type  :  LPJTCHAR	
 *
 *		No  Parameter
 *
 *   Note:
 *		 TODO
 *
 *	Create	:   
 *		Date			   Time				Author
 *	------------------------------------------------
 *   2006-3-28           17:19:32			XiaoWei
 */
LPJTCHAR	JAVA_String::getLocalString()
{
	JAVA_StringData * _lpStringData = _ToStringData(_getdata());
	LPJTCHAR __lpString = _lpStringData->data();
	return __lpString;
}


JNI_String  JAVA_String::getJniString()
{	
	__createJniString();
	return m_JniString;
}


void	JAVA_String::__releaseJniString()
{
	if (m_JniString != JNI_NULL) {
		
		JNI_Env *  __lpEnv = JAVA_VM::getInstance()->getEnv();
		if (__lpEnv) {
			
			const JNI_Char * __lpChar = __lpEnv->GetStringChars(m_JniString,0); 
			
			__lpEnv->ReleaseStringChars(m_JniString,__lpChar);
			
			__setChange();
		}
	}
}


void	JAVA_String::__createJniString()
{
	JNI_Env *  __lpEnv = JAVA_VM::getInstance()->getEnv();
	if (__lpEnv) {
		JAVA_StringData * _lpStringData = _ToStringData(_getdata());
		if (__isChange() || m_JniString == JNI_NULL) {
			__releaseJniString();
#ifdef _UNICODE
			m_JniString = __lpEnv->NewString(_lpStringData->data(),_lpStringData->getDataLength());
			__setNoChange();
#else
			INT  _wcharSize = _lpStringData->getDataLength();
			JNI_Char* buffer = new JNI_Char[_wcharSize]; 

			JAVA_StringData::_LPBufferType __lpBuffer = (JAVA_StringData::_LPBufferType)_lpStringData->data();
			long __len = ::MultiByteToWideChar(CP_ACP,0,(LPJTCHAR)__lpBuffer,
							_lpStringData->getDataLength(),buffer,_wcharSize); 
			m_JniString = __lpEnv->NewString(buffer,__len);
			delete [] buffer;
			__setNoChange();
#endif
		}
	}
}


JAVA_String& JAVA_String::operator = (JAVA_String & _string)
{
	if (this != &_string) {
		__release();		
		LPJTCHAR		__lpData = _string._getdata();	
		_setdata(__lpData);
		JAVA_StringData * _lpStringData = _ToStringData(_getdata());
		_lpStringData->addRef();
		__setChange();
	}
	return *this;
}


JAVA_String& JAVA_String::operator = (const LPJTCHAR  _string)
{
	if (_string) {
		JAVA_StringData * _lpStringData = _ToStringData(_getdata());
		__release();
		__assignAndCopy(_string);
		__setChange();
	}
	return *this;
}

JAVA_String& JAVA_String::operator = (const JNI_String&	 _string)
{
	if (_string) {
		
		
		JNI_Env *  __lpEnv = JAVA_VM::getInstance()->getEnv();
		const JNI_Char * __lpChar = __lpEnv->GetStringChars(_string,0);
		JNI_Int		__len = __lpEnv->GetStringLength(_string);  
		__init();
#ifdef  _UNICODE	
		__s_copy(__lpChar,__len);	
#else
		long __strLen = __len*2+1;
		__assign(__strLen );
		JAVA_StringData * _lpStringData = _ToStringData(_getdata());
		LPJTCHAR __lpBuffer = _lpStringData->data();
		int n = ::WideCharToMultiByte(CP_ACP, 0, __lpChar, __len, __lpBuffer,
			__strLen, NULL, NULL);
		
		__lpBuffer[n] = '\0';
		_lpStringData->setDataLength(n);
		
#endif
		__setChange();
	}
	return *this;
}

bool		JAVA_String::isEmpty()
{
	JAVA_StringData * _lpStringData = _ToStringData(_getdata());
	return _lpStringData->getDataLength() == 0L;
}

⌨️ 快捷键说明

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