소스 검색

JNI Updates.

Mark Sibly 8 년 전
부모
커밋
a2d420e9e8
3개의 변경된 파일127개의 추가작업 그리고 36개의 파일을 삭제
  1. 25 7
      modules/jni/jni.monkey2
  2. 91 25
      modules/jni/native/jni_glue.cpp
  3. 11 4
      modules/jni/native/jni_glue.h

+ 25 - 7
modules/jni/jni.monkey2

@@ -10,27 +10,30 @@ Extern
 
 
 Struct _jclass
 Struct _jclass
 End
 End
-
 Alias jclass:_jclass Ptr
 Alias jclass:_jclass Ptr
 
 
 Struct _jobject
 Struct _jobject
 End
 End
-
 Alias jobject:_jobject Ptr
 Alias jobject:_jobject Ptr
 
 
 Struct _jstring
 Struct _jstring
 End
 End
-
 Alias jstring:_jstring Ptr
 Alias jstring:_jstring Ptr
 
 
-Struct _jfieldID
+Struct _jarray
+End
+Alias jarray:_jarray Ptr
+
+Struct _jobjectArray
 End
 End
+Alias jobjectArray:_jobjectArray Ptr
 
 
+Struct _jfieldID
+End
 Alias jfieldID:_jfieldID Ptr
 Alias jfieldID:_jfieldID Ptr
 
 
 Struct _jmethodID
 Struct _jmethodID
 End
 End
-
 Alias jmethodID:_jmethodID Ptr
 Alias jmethodID:_jmethodID Ptr
 
 
 Class JNIEnv Extends Void
 Class JNIEnv Extends Void
@@ -48,8 +51,15 @@ Class JNIEnv Extends Void
 	'fields...
 	'fields...
 	'
 	'
 	Method GetFieldID:jfieldID( clazz:jclass,name:CString,sig:CString )
 	Method GetFieldID:jfieldID( clazz:jclass,name:CString,sig:CString )
-	
+		
+	Method GetBooleanField:Bool( obj:jobject,fieldID:jfieldID )
+		
+	Method GetIntField:Int( obj:jobject,fieldID:jfieldID )
+		
 	Method GetObjectField:jobject( obj:jobject,fieldID:jfieldID )
 	Method GetObjectField:jobject( obj:jobject,fieldID:jfieldID )
+
+	Method GetStringField:String( obj:jobject,fieldID:jfieldID ) Extension="bbJNI::GetStringField"
+		
 	
 	
 	'static fields...
 	'static fields...
 	
 	
@@ -65,10 +75,12 @@ Class JNIEnv Extends Void
 	
 	
 	Method CallBooleanMethod:Bool( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallBooleanMethod"
 	Method CallBooleanMethod:Bool( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallBooleanMethod"
 
 
-	Method CallStringMethod:String( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStringMethod"
+	Method CallIntMethod:Int( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallIntMethod"
 
 
 	Method CallObjectMethod:jobject( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallObjectMethod"
 	Method CallObjectMethod:jobject( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallObjectMethod"
 	
 	
+	Method CallStringMethod:String( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStringMethod"
+
 	'static methods...
 	'static methods...
 	'
 	'
 	Method GetStaticMethodID:jmethodID( clazz:jclass,name:CString,sig:CString )
 	Method GetStaticMethodID:jmethodID( clazz:jclass,name:CString,sig:CString )
@@ -77,6 +89,8 @@ Class JNIEnv Extends Void
 
 
 	Method CallStaticBooleanMethod:Bool( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticBooleanMethod"
 	Method CallStaticBooleanMethod:Bool( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticBooleanMethod"
 
 
+	Method CallStaticIntMethod:int( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticIntMethod"
+
 	Method CallStaticStringMethod:String( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticStringMethod"
 	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"
@@ -87,6 +101,10 @@ Class JNIEnv Extends Void
 		
 		
 	Method NewObject:jobject( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::NewObject"
 	Method NewObject:jobject( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::NewObject"
 		
 		
+	Method NewObjectArray:jobjectArray( length:Int,clazz:jclass,init:jobject )
+		
+	Method SetObjectArrayElement( jarray:jobjectArray,index:Int,value:jobject )
+		
 	'refs...
 	'refs...
 	'
 	'
 	Method NewGlobalRef:jobject( obj:jobject )
 	Method NewGlobalRef:jobject( obj:jobject )

+ 91 - 25
modules/jni/native/jni_glue.cpp

@@ -3,30 +3,6 @@
 
 
 namespace bbJNI{
 namespace bbJNI{
 
 
-	bbString JStringToString( JNIEnv *env,jstring jstr ){
-	
-		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;
-	}
-
 	jvalue *makeArgs( JNIEnv *env,bbArray<bbVariant> args ){
 	jvalue *makeArgs( JNIEnv *env,bbArray<bbVariant> args ){
 	
 	
 		jvalue *jargs=new jvalue[args.length()];
 		jvalue *jargs=new jvalue[args.length()];
@@ -53,6 +29,12 @@ namespace bbJNI{
 				
 				
 				jarg->i=val;
 				jarg->i=val;
 			
 			
+			}else if( type==bbGetType<jobject>() ){
+			
+				jobject jobj=arg.get<jobject>();
+			
+				jarg->l=jobj;
+			
 			}else if( type==bbGetType<bbString>() ){
 			}else if( type==bbGetType<bbString>() ){
 			
 			
 				bbString str=arg.get<bbString>();
 				bbString str=arg.get<bbString>();
@@ -66,7 +48,39 @@ namespace bbJNI{
 				jstring jstr=env->NewStringUTF( buf );
 				jstring jstr=env->NewStringUTF( buf );
 				
 				
 				jarg->l=jstr;
 				jarg->l=jstr;
+/*				
+			}else if( type==bbGetType<bbArray<bbBool>>() ){
+			
+				bbArray<bbBool> arr=arg.get<bbArray<bbBool>>();
+				
+				jbooleanArray jarr=env->NewBooleanArray( arr.length() );
+				
+				jboolean *jdata=env->GetBooleanArrayElements( jarr,0 );
+				
+				memcpy( jdata,arr.data(),arr.length()*sizeof(bbBool) );
+				
+				env->ReleaseBooleanArrayElements( jarr,jdata,0 );
+				
+				jarg->l=(jobject)jarr;
+				
+			}else if( type==bbGetType<bbArray<bbInt>>() ){
+
+				bbArray<bbInt> arr=arg.get<bbArray<bbInt>>();
+				
+				jintArray jarr=env->NewIntArray( arr.length() );
+				
+				jint *jdata=env->GetIntArrayElements( jarr,0 );
+				
+				memcpy( jdata,arr.data(),arr.length()*sizeof(bbInt) );
+				
+				env->ReleaseIntArrayElements( jarr,jdata,0 );
+				
+				jarg->l=(jobject)jarr;
+			
+			}else if( type==bbGetType<bbArray<jobject>>() ){
 			
 			
+			}else if( type==bbGetType<bbArray<bbString>>() ){
+*/			
 			}else{
 			}else{
 			
 			
 				bbRuntimeError( "Can't evaluate JNI method param of typ:"+type->toString() );
 				bbRuntimeError( "Can't evaluate JNI method param of typ:"+type->toString() );
@@ -78,6 +92,37 @@ namespace bbJNI{
 		return jargs;
 		return jargs;
 	}
 	}
 	
 	
+	bbString JStringToString( JNIEnv *env,jstring jstr ){
+	
+		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 GetStringField( JNIEnv *env,jobject obj,jfieldID fieldID ){
+	
+		jstring jstr=(jstring)env->GetObjectField( obj,fieldID );
+		
+		return JStringToString( env,jstr );
+	}
+
 	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
 	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
 		
 		
 		jvalue *jargs=makeArgs( env,args );
 		jvalue *jargs=makeArgs( env,args );
@@ -98,6 +143,17 @@ namespace bbJNI{
 		return r;
 		return r;
 	}
 	}
 
 
+	bbInt CallIntMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
+		
+		jvalue *jargs=makeArgs( env,args );
+		
+		bbInt r=env->CallIntMethodA( obj,methodID,jargs );
+		
+		delete[] jargs;
+		
+		return r;
+	}
+
 	bbString CallStringMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
 	bbString CallStringMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
 		
 		
 		jvalue *jargs=makeArgs( env,args );
 		jvalue *jargs=makeArgs( env,args );
@@ -140,6 +196,17 @@ namespace bbJNI{
 		return r;
 		return r;
 	}
 	}
 	
 	
+	bbInt CallStaticIntMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
+		
+		jvalue *jargs=makeArgs( env,args );
+		
+		bbInt r=env->CallStaticIntMethodA( clazz,methodID,jargs );
+		
+		delete[] jargs;
+		
+		return r;
+	}
+	
 	bbString CallStaticStringMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
 	bbString CallStaticStringMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
 		
 		
 		jvalue *jargs=makeArgs( env,args );
 		jvalue *jargs=makeArgs( env,args );
@@ -174,4 +241,3 @@ namespace bbJNI{
 	}
 	}
 	
 	
 }
 }
-

+ 11 - 4
modules/jni/native/jni_glue.h

@@ -5,11 +5,20 @@
 
 
 namespace bbJNI{
 namespace bbJNI{
 
 
+	bbString JStringToString( JNIEnv *env,jstring jstr );
+	
+	jstring StringToJString( JNIEnv *env,bbString str );
+	
+	
+	bbString GetStringField( JNIEnv *env,jobject obj,jfieldID fieldID );
+
 
 
 	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 	
 	
 	bbBool CallBooleanMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 	bbBool CallBooleanMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 
 
+	bbInt CallIntMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
+
 	bbString CallStringMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 	bbString CallStringMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 
 
 	jobject CallObjectMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
 	jobject CallObjectMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
@@ -19,6 +28,8 @@ namespace bbJNI{
 	
 	
 	bbBool CallStaticBooleanMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 	bbBool CallStaticBooleanMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 
 
+	bbInt CallStaticIntMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
+
 	bbString CallStaticStringMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 	bbString CallStaticStringMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 
 
 	jobject CallStaticObjectMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 	jobject CallStaticObjectMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
@@ -27,8 +38,4 @@ namespace bbJNI{
 	jobject NewObject( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 	jobject NewObject( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args );
 	
 	
 
 
-	bbString JStringToString( JNIEnv *env,jstring jstr );
-	
-	jstring StringToJString( JNIEnv *env,bbString str );
-
 }
 }