From ff8fd79bd47873cbab27fb9aeee41bdee737fc5d Mon Sep 17 00:00:00 2001 From: Eliot Horowitz Date: Thu, 18 Sep 2008 09:38:59 -0400 Subject: jni lies - you do need to release things --- db/javajs.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/db/javajs.cpp b/db/javajs.cpp index c10f38d5b8d..8241d5e8379 100644 --- a/db/javajs.cpp +++ b/db/javajs.cpp @@ -252,44 +252,72 @@ void JavaJSImpl::scopeFree( jlong id ){ // scope setters int JavaJSImpl::scopeSetBoolean( jlong id , const char * field , jboolean val ) { - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); + jstring fieldString = _getEnv()->NewStringUTF( field ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , fieldString , val ); + _getEnv()->DeleteLocalRef( fieldString ); + return res; } int JavaJSImpl::scopeSetNumber( jlong id , const char * field , double val ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _getEnv()->NewStringUTF( field ) , val ); + jstring fieldString = _getEnv()->NewStringUTF( field ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , fieldString , val ); + _getEnv()->DeleteLocalRef( fieldString ); + return res; } int JavaJSImpl::scopeSetString( jlong id , const char * field , const char * val ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetString , id , _getEnv()->NewStringUTF( field ) , _getEnv()->NewStringUTF( val ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + jstring s2 = _getEnv()->NewStringUTF( val ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetString , id , s1 , s2 ); + _getEnv()->DeleteLocalRef( s1 ); + _getEnv()->DeleteLocalRef( s2 ); + return res; } int JavaJSImpl::scopeSetObject( jlong id , const char * field , JSObj * obj ){ jobject bb = 0; if ( obj ){ - //cout << "from c : " << obj->toString() << endl; bb = _getEnv()->NewDirectByteBuffer( (void*)(obj->objdata()) , (jlong)(obj->objsize()) ); jassert( bb ); } + + jstring s1 = _getEnv()->NewStringUTF( field ); + int res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetObject , id , s1 , bb ); + _getEnv()->DeleteLocalRef( s1 ); + if ( bb ) + _getEnv()->DeleteLocalRef( bb ); - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeSetObject , id , _getEnv()->NewStringUTF( field ) , bb ); + return res; } // scope getters char JavaJSImpl::scopeGetType( jlong id , const char * field ){ - return _getEnv()->CallStaticByteMethod( _dbhook , _scopeGetType , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + int res =_getEnv()->CallStaticByteMethod( _dbhook , _scopeGetType , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + return res; } double JavaJSImpl::scopeGetNumber( jlong id , const char * field ){ - return _getEnv()->CallStaticDoubleMethod( _dbhook , _scopeGetNumber , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + double res = _getEnv()->CallStaticDoubleMethod( _dbhook , _scopeGetNumber , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + return res; } jboolean JavaJSImpl::scopeGetBoolean( jlong id , const char * field ){ - return _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + jboolean res = _getEnv()->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + return res; } string JavaJSImpl::scopeGetString( jlong id , const char * field ) { - jstring s = (jstring)_getEnv()->CallStaticObjectMethod( _dbhook , _scopeGetString , id , _getEnv()->NewStringUTF( field ) ); + jstring s1 = _getEnv()->NewStringUTF( field ); + jstring s = (jstring)_getEnv()->CallStaticObjectMethod( _dbhook , _scopeGetString , id , s1 ); + _getEnv()->DeleteLocalRef( s1 ); + if ( ! s ) return ""; @@ -302,13 +330,16 @@ string JavaJSImpl::scopeGetString( jlong id , const char * field ) { #ifdef J_USE_OBJ JSObj JavaJSImpl::scopeGetObject( jlong id , const char * field ) { + jstring s1 = _getEnv()->NewStringUTF( field ); int guess = _getEnv()->CallStaticIntMethod( _dbhook , _scopeGuessObjectSize , id , _getEnv()->NewStringUTF( field ) ); + _getEnv()->DeleteLocalRef( s1 ); char * buf = (char *) malloc(guess); jobject bb = _getEnv()->NewDirectByteBuffer( (void*)buf , guess ); jassert( bb ); int len = _getEnv()->CallStaticIntMethod( _dbhook , _scopeGetObject , id , _getEnv()->NewStringUTF( field ) , bb ); + _getEnv()->DeleteLocalRef( bb ); //cout << "len : " << len << endl; jassert( len > 0 && len < guess ); @@ -324,6 +355,7 @@ jlong JavaJSImpl::functionCreate( const char * code ){ jstring s = _getEnv()->NewStringUTF( code ); jassert( s ); jlong id = _getEnv()->CallStaticLongMethod( _dbhook , _functionCreate , s ); + _getEnv()->DeleteLocalRef( s ); return id; } @@ -342,6 +374,7 @@ void JavaJSImpl::run( const char * js ){ jstring s = _getEnv()->NewStringUTF( js ); log() << _getEnv()->CallStaticObjectMethod( c , m , s ) << endl; + _getEnv()->DeleteLocalRef( s ); } void JavaJSImpl::printException(){ -- cgit v1.2.1