Parcourir la source

More JNI features.

Mark Sibly il y a 7 ans
Parent
commit
f4692c6bf7
2 fichiers modifiés avec 117 ajouts et 33 suppressions
  1. 24 7
      modules/jni/jni.monkey2
  2. 93 26
      modules/jni/native/jni_glue.cpp

+ 24 - 7
modules/jni/jni.monkey2

@@ -55,18 +55,31 @@ Class JNIEnv Extends Void
 	Method GetBooleanField:Bool( obj:jobject,fieldID:jfieldID )
 		
 	Method GetIntField:Int( obj:jobject,fieldID:jfieldID )
-		
-	Method GetObjectField:jobject( obj:jobject,fieldID:jfieldID )
+
+	Method GetFloatField:Float( obj:jobject,fieldID:jfieldID )
+
+	Method GetDoubleField:Double( obj:jobject,fieldID:jfieldID )
 
 	Method GetStringField:String( obj:jobject,fieldID:jfieldID ) Extension="bbJNI::GetStringField"
+
+	Method GetObjectField:jobject( obj:jobject,fieldID:jfieldID )
 		
-	
 	'static fields...
 	
 	Method GetStaticFieldID:jfieldID( clazz:jclass,name:CString,sig:CString )
 	
+	Method GetStaticBooleanField:Bool( obj:jobject,fieldID:jfieldID )
+		
+	Method GetStaticIntField:Int( obj:jobject,fieldID:jfieldID )
+
+	Method GetStaticFloatField:Float( obj:jobject,fieldID:jfieldID )
+
+	Method GetStaticDoubleField:Double( obj:jobject,fieldID:jfieldID )
+
+	Method GetStaticStringField:String( clazz:jclass,fieldID:jfieldID ) Extension="bbJNI::GetStaticStringField"
+
 	Method GetStaticObjectField:jobject( clazz:jclass,fieldID:jfieldID )
-	
+		
 	'methods...
 	'
 	Method GetMethodID:jmethodID( clazz:jclass,name:CString,sig:CString )
@@ -79,10 +92,12 @@ Class JNIEnv Extends Void
 		
 	Method CallFloatMethod:Float( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallFloatMethod"
 
-	Method CallObjectMethod:jobject( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallObjectMethod"
+	Method CallDoubleMethod:Double( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallDoubleMethod"
 	
 	Method CallStringMethod:String( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStringMethod"
 
+	Method CallObjectMethod:jobject( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallObjectMethod"
+
 	'static methods...
 	'
 	Method GetStaticMethodID:jmethodID( clazz:jclass,name:CString,sig:CString )
@@ -95,10 +110,12 @@ Class JNIEnv Extends Void
 		
 	Method CallStaticFloatMethod:Float( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticFloatMethod"
 
+	Method CallStaticDoubleMethod:Double( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticDoubleMethod"
+
 	Method CallStaticStringMethod:String( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticStringMethod"
-	
-	Method CallStaticObjectMethod:jobject( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticObjectMethod"
 
+	Method CallStaticObjectMethod:jobject( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticObjectMethod"
+	
 	'ctors...
 	'
 	Method AllocObject:jobject( clazz:jclass )

+ 93 - 26
modules/jni/native/jni_glue.cpp

@@ -3,23 +3,31 @@
 
 namespace bbJNI{
 
-	jstring jstring_refs[64];
-	jstring *jstring_refsp=jstring_refs;
+	//64 params max
+	const int MAX_LOCAL_REFS=64;
+
+	jobject local_refs[MAX_LOCAL_REFS];
 	
-	void AddStrRef( jstring jstr ){
-		
-		*jstring_refsp++=jstr;
+	int num_local_refs=0;
+	
+	void AddLocalRef( jobject jobj ){
+	
+		if( num_local_refs==MAX_LOCAL_REFS ) return;
+	
+		local_refs[num_local_refs++]=jobj;
 	}
 	
-	void DeleteStrRefs( JNIEnv *env ){
+	void DeleteLocalRefs( JNIEnv *env ){
 	
-		while( jstring_refsp!=jstring_refs ){
+		while( num_local_refs ){
 			
-			jstring jstr=*--jstring_refsp;
+			jobject jobj=local_refs[--num_local_refs];
 			
-			env->DeleteLocalRef( (jobject)jstr );
+			env->DeleteLocalRef( jobj );
 		}
 	}
+	
+	// ***** Utility *****
 
 	bbString JStringToString( JNIEnv *env,jstring jstr ){
 	
@@ -73,11 +81,17 @@ namespace bbJNI{
 				
 				jarg->i=val;
 			
-			}else if( type==bbGetType<jobject>() ){
+			}else if( type==bbGetType<bbFloat>() ){
 			
-				jobject jobj=arg.get<jobject>();
+				bbFloat val=arg.get<bbFloat>();
+				
+				jarg->f=val;
 			
-				jarg->l=jobj;
+			}else if( type==bbGetType<bbDouble>() ){
+			
+				bbDouble val=arg.get<bbDouble>();
+				
+				jarg->d=val;
 			
 			}else if( type==bbGetType<bbString>() ){
 			
@@ -85,9 +99,15 @@ namespace bbJNI{
 				
 				jstring jstr=StringToJString( env,str );
 				
-				AddStrRef( jstr );
+				AddLocalRef( (jobject)jstr );
 				
 				jarg->l=jstr;
+
+			}else if( type==bbGetType<jobject>() ){
+			
+				jobject jobj=arg.get<jobject>();
+			
+				jarg->l=jobj;
 /*				
 			}else if( type==bbGetType<bbArray<bbBool>>() ){
 			
@@ -132,6 +152,8 @@ namespace bbJNI{
 		return jargs;
 	}
 	
+	// ***** Instance fields *****
+	
 	bbString GetStringField( JNIEnv *env,jobject obj,jfieldID fieldID ){
 	
 		jstring jstr=(jstring)env->GetObjectField( obj,fieldID );
@@ -142,6 +164,21 @@ namespace bbJNI{
 		
 		return r;
 	}
+	
+	// ***** Static fields *****
+
+	bbString GetStaticStringField( JNIEnv *env,jclass clazz,jfieldID fieldID ){
+	
+		jstring jstr=(jstring)env->GetStaticObjectField( clazz,fieldID );
+		
+		bbString r=JStringToString( env,jstr );
+		
+		env->DeleteLocalRef( jstr );
+		
+		return r;
+	}
+	
+	// ***** Instance methods *****
 
 	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
 		
@@ -149,7 +186,7 @@ namespace bbJNI{
 		
 		env->CallVoidMethodA( obj,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 	}
@@ -160,7 +197,7 @@ namespace bbJNI{
 		
 		bbBool r=env->CallBooleanMethodA( obj,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -173,7 +210,7 @@ namespace bbJNI{
 		
 		bbInt r=env->CallIntMethodA( obj,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -186,7 +223,20 @@ namespace bbJNI{
 		
 		bbFloat r=env->CallFloatMethodA( obj,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
+		
+		delete[] jargs;
+		
+		return r;
+	}
+
+	bbDouble CallDoubleMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
+		
+		jvalue *jargs=makeArgs( env,args );
+		
+		bbDouble r=env->CallDoubleMethodA( obj,methodID,jargs );
+		
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -203,7 +253,7 @@ namespace bbJNI{
 		
 		env->DeleteLocalRef( jstr );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -216,12 +266,14 @@ namespace bbJNI{
 		
 		jobject r=env->CallObjectMethodA( obj,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
 		return r;
 	}
+	
+	// ***** Static methods *****
 
 	void CallStaticVoidMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
 		
@@ -229,7 +281,7 @@ namespace bbJNI{
 		
 		env->CallStaticVoidMethodA( clazz,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 	}
@@ -240,7 +292,7 @@ namespace bbJNI{
 		
 		bbBool r=env->CallStaticBooleanMethodA( clazz,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -253,7 +305,7 @@ namespace bbJNI{
 		
 		bbInt r=env->CallStaticIntMethodA( clazz,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -266,7 +318,20 @@ namespace bbJNI{
 		
 		bbFloat r=env->CallStaticFloatMethodA( clazz,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
+		
+		delete[] jargs;
+		
+		return r;
+	}
+	
+	bbDouble CallStaticDoubleMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
+		
+		jvalue *jargs=makeArgs( env,args );
+		
+		bbDouble r=env->CallStaticDoubleMethodA( clazz,methodID,jargs );
+		
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -283,7 +348,7 @@ namespace bbJNI{
 		
 		env->DeleteLocalRef( jstr );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
@@ -296,20 +361,22 @@ namespace bbJNI{
 		
 		jobject r=env->CallStaticObjectMethodA( clazz,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;
 		
 		return r;
 	}
 	
+	// ***** ctors *****
+	
 	jobject NewObject( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
 
 		jvalue *jargs=makeArgs( env,args );
 		
 		jobject r=env->NewObjectA( clazz,methodID,jargs );
 		
-		DeleteStrRefs( env );
+		DeleteLocalRefs( env );
 		
 		delete[] jargs;