소스 검색

WIP JNI module.

Mark Sibly 8 년 전
부모
커밋
ef308494b5
3개의 변경된 파일99개의 추가작업 그리고 23개의 파일을 삭제
  1. 46 8
      modules/jni/jni.monkey2
  2. 49 11
      modules/jni/native/jni_glue.cpp
  3. 4 4
      modules/jni/native/jni_glue.h

+ 46 - 8
modules/jni/jni.monkey2

@@ -3,27 +3,65 @@ Namespace jni
 
 #If __TARGET__="android"
 
-#Import "<mojo>"
-
 #Import "native/jni_glue.cpp"
 #Import "native/jni_glue.h"
 
 Extern
 
-Class jobject Extends Void
+Struct _jclass
 End
 
-Class jclass Extends jobject
+Alias jclass:_jclass Ptr
+
+Struct _jobject
 End
 
-Class jfieldID Extends Void
+Alias jobject:_jobject Ptr
+
+Struct _jstring
 End
 
-Class jmethodID Extends Void
+Alias jstring:_jstring Ptr
+
+Struct _jfieldID
 End
 
-Function FindClass:jclass( name:CString )="bbJNI::FindClass"
+Alias jfieldID:_jfieldID Ptr
+
+Struct _jmethodID
+End
 
-Function GetMethodID( clazz:jclass,name:CString,sig:CString )="bbJNI::GetMethodID"
+Alias jmethodID:_jmethodID Ptr
+
+Class JNIEnv Extends Void
+
+	Method FindClass:jclass( name:CString )
+
+	'fields...
+	'
+	Method GetFieldID:jfieldID( clazz:jclass,name:CString,sig:CString )
+	
+	Method GetObjectField:jobject( obj:jobject,fieldID:jfieldID )
+	
+	'static fields...
+	
+	Method GetStaticFieldID:jfieldID( clazz:jclass,name:CString,sig:CString )
+	
+	Method GetStaticObjectField:jobject( clazz:jclass,fieldID:jfieldID )
+	
+	'methods...
+	'
+	Method GetMethodID:jmethodID( clazz:jclass,name:CString,sig:CString )
+
+	Method CallVoidMethod:Void( obj:jobject,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallVoidMethod"
+	
+	'static methods...
+	'
+	Method GetStaticMethodID:jmethodID( clazz:jclass,name:CString,sig:CString )
+	
+	Method CallStaticVoidMethod:Void( clazz:jclass,methodID:jmethodID,args:Variant[] ) Extension="bbJNI::CallStaticVoidMethod"
+	
+	
+End
 
 #End

+ 49 - 11
modules/jni/native/jni_glue.cpp

@@ -1,23 +1,61 @@
 
 #include "jni_glue.h"
 
-extern "C"{
-	JNIEnv *Android_JNI_GetEnv(void);
-}
-
 namespace bbJNI{
 
-	jclass FindClass( const char *name ){
+	jvalue *makeArgs( JNIEnv *env,bbArray<bbVariant> args ){
 	
-		JNIEnv *env=Android_JNI_GetEnv();
+		jvalue *jargs=new jvalue[args.length()];
+		
+		memset( jargs,0,sizeof( jvalue ) * args.length() );
+		
+		jvalue *jarg=jargs;
+		
+		for( int i=0;i<args.length();++i ){
+		
+			bbVariant arg=args[i];
+			
+			bbTypeInfo *type=arg.getType();
+			
+			if( type==bbGetType<bbInt>() ){
+			
+				bbInt val=arg.get<bbInt>();
+				
+				jarg->i=val;
+			
+			}else if( type==bbGetType<bbString>() ){
+			
+				bbString str=arg.get<bbString>();
+				
+				int n=str.utf8Length()+1;
+				
+				char *buf=new char[n];
+				
+				str.toCString( buf,n );
+				
+				jstring jstr=env->NewStringUTF( buf );
+				
+				jarg->l=jstr;
+			
+			}else{
+			
+				bbRuntimeError( "Can't evaluate JNI method param of typ:"+type->toString() );
+			}
+			
+			++jarg;
+		}
 		
-		return env->FindClass( name );
+		return jargs;
 	}
-
-	jmethodID GetMethodID( jclass clazz,const char *name,const char *sig ){
 	
-		JNIEnv *env=Android_JNI_GetEnv();
+	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
+		
+		jvalue *jargs=makeArgs( env,args );
+		
+		env->CallVoidMethodA( obj,methodID,jargs );
 		
-		return env->GetMethodID( clazz,name,sig );
+		delete[] jargs;
 	}
+
 }
+

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

@@ -1,10 +1,10 @@
 
 #include <jni.h>
 
+#include <bbmonkey.h>
+
 namespace bbJNI{
 
-	jclass FindClass( const char *name );
-	
-	jmethodID GetMethodID( jclass clazz,const char *name,const char *sig );
-	
+	void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args );
+
 }