Forráskód Böngészése

Fixed android too many local refs with string methods.

Mark Sibly 7 éve
szülő
commit
02b11caf7c
1 módosított fájl, 13 hozzáadás és 16 törlés
  1. 13 16
      modules/monkey/native/bbstring.cpp

+ 13 - 16
modules/monkey/native/bbstring.cpp

@@ -28,30 +28,30 @@ namespace{
 	jmethodID jmethod_capitalize;
 
 	bbString JStringToString( JNIEnv *env,jstring jstr ){
-	
 		if( !jstr ) return "";
-	
 		const char *cstr=env->GetStringUTFChars( jstr,0 );
-		
 		bbString str=bbString::fromCString( cstr );
-		
 		env->ReleaseStringUTFChars( jstr,cstr );
-		
 		return str;
 	}
 	
 	jstring StringToJString( JNIEnv *env,bbString str ){
-	
 		int n=str.utf8Length()+1;
-		
 		char *buf=new char[n];
-		
 		str.toCString( buf,n );
-		
 		jstring jstr=env->NewStringUTF( buf );
-		
 		return jstr;
 	}
+	
+	bbString invokeStaticStringMethod( jmethodID jmethod,bbString arg ){
+		JNIEnv *env=(JNIEnv*)SDL_AndroidGetJNIEnv();
+		jstring jarg=StringToJString( env,arg );
+		jstring jres=(jstring)env->CallStaticObjectMethod( jclass_lang,jmethod,jarg );
+		bbString res=JStringToString( env,jres );
+		env->DeleteLocalRef( jres );
+		env->DeleteLocalRef( jarg );
+		return res;
+	}
 #endif
 	
 	void initLocale(){
@@ -519,8 +519,7 @@ bbString bbString::slice( int from,int term )const{
 bbString bbString::toUpper()const{
 	initLocale();
 #if BB_ANDROID
-	JNIEnv *env=(JNIEnv*)SDL_AndroidGetJNIEnv();
-	return JStringToString( env,(jstring)env->CallStaticObjectMethod( jclass_lang,jmethod_toUpper,StringToJString( env,*this ) ) );
+	return invokeStaticStringMethod( jmethod_toUpper,*this );
 #else
 	Rep *rep=Rep::alloc( length() );
 	for( int i=0;i<length();++i ) rep->data[i]=::towupper( data()[i] );
@@ -531,8 +530,7 @@ bbString bbString::toUpper()const{
 bbString bbString::toLower()const{
 	initLocale();
 #if BB_ANDROID
-	JNIEnv *env=(JNIEnv*)SDL_AndroidGetJNIEnv();
-	return JStringToString( env,(jstring)env->CallStaticObjectMethod( jclass_lang,jmethod_toLower,StringToJString( env,*this ) ) );
+	return invokeStaticStringMethod( jmethod_toLower,*this );
 #else
 	Rep *rep=Rep::alloc( length() );
 	for( int i=0;i<length();++i ) rep->data[i]=::towlower( data()[i] );
@@ -543,8 +541,7 @@ bbString bbString::toLower()const{
 bbString bbString::capitalize()const{
 	initLocale();
 #if BB_ANDROID
-	JNIEnv *env=(JNIEnv*)SDL_AndroidGetJNIEnv();
-	return JStringToString( env,(jstring)env->CallStaticObjectMethod( jclass_lang,jmethod_capitalize,StringToJString( env,*this ) ) );
+	return invokeStaticStringMethod( jmethod_capitalize,*this );
 #else
 	if( !length() ) return &_nullRep;
 	Rep *rep=Rep::alloc( length() );