123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- #include "jni_glue.h"
- namespace bbJNI{
- //64 params max
- const int MAX_LOCAL_REFS=64;
- jobject local_refs[MAX_LOCAL_REFS];
-
- int num_local_refs=0;
-
- void AddLocalRef( jobject jobj ){
-
- if( num_local_refs==MAX_LOCAL_REFS ) return;
-
- local_refs[num_local_refs++]=jobj;
- }
-
- void DeleteLocalRefs( JNIEnv *env ){
-
- while( num_local_refs ){
-
- jobject jobj=local_refs[--num_local_refs];
-
- env->DeleteLocalRef( jobj );
- }
- }
-
- // ***** Utility *****
- 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;
- }
-
- jvalue *makeArgs( JNIEnv *env,bbArray<bbVariant> args ){
-
- 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<bbBool>() ){
-
- bbBool val=arg.get<bbBool>();
-
- jarg->z=val;
-
- }else if( type==bbGetType<bbInt>() ){
-
- bbInt val=arg.get<bbInt>();
-
- jarg->i=val;
-
- }else if( type==bbGetType<bbFloat>() ){
-
- bbFloat val=arg.get<bbFloat>();
-
- jarg->f=val;
-
- }else if( type==bbGetType<bbDouble>() ){
-
- bbDouble val=arg.get<bbDouble>();
-
- jarg->d=val;
-
- }else if( type==bbGetType<bbString>() ){
-
- bbString str=arg.get<bbString>();
-
- jstring jstr=StringToJString( env,str );
-
- 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>>() ){
-
- 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{
-
- bbRuntimeError( "Can't evaluate JNI method param of typ:"+type->toString() );
- }
-
- ++jarg;
- }
-
- return jargs;
- }
-
- // ***** Instance fields *****
-
- bbString GetStringField( JNIEnv *env,jobject obj,jfieldID fieldID ){
-
- jstring jstr=(jstring)env->GetObjectField( obj,fieldID );
-
- bbString r=JStringToString( env,jstr );
-
- env->DeleteLocalRef( jstr );
-
- 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 ){
-
- jvalue *jargs=makeArgs( env,args );
-
- env->CallVoidMethodA( obj,methodID,jargs );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
- }
- bbBool CallBooleanMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- bbBool r=env->CallBooleanMethodA( obj,methodID,jargs );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- 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 );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- return r;
- }
- bbFloat CallFloatMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- bbFloat r=env->CallFloatMethodA( obj,methodID,jargs );
-
- 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;
-
- return r;
- }
- bbString CallStringMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- jstring jstr=(jstring)env->CallObjectMethodA( obj,methodID,jargs );
-
- bbString r=JStringToString( env,jstr );
-
- env->DeleteLocalRef( jstr );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- return r;
- }
- jobject CallObjectMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- jobject r=env->CallObjectMethodA( obj,methodID,jargs );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- return r;
- }
-
- // ***** Static methods *****
- void CallStaticVoidMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- env->CallStaticVoidMethodA( clazz,methodID,jargs );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
- }
- bbBool CallStaticBooleanMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- bbBool r=env->CallStaticBooleanMethodA( clazz,methodID,jargs );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- 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 );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- return r;
- }
- bbFloat CallStaticFloatMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- bbFloat r=env->CallStaticFloatMethodA( clazz,methodID,jargs );
-
- 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;
-
- return r;
- }
-
- bbString CallStaticStringMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
- jstring jstr=(jstring)env->CallStaticObjectMethodA( clazz,methodID,jargs );
-
- bbString r=JStringToString( env,jstr );
-
- env->DeleteLocalRef( jstr );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- return r;
- }
-
- jobject CallStaticObjectMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
-
- jvalue *jargs=makeArgs( env,args );
-
- jobject r=env->CallStaticObjectMethodA( clazz,methodID,jargs );
-
- 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 );
-
- DeleteLocalRefs( env );
-
- delete[] jargs;
-
- return r;
- }
-
- }
|