jni_glue.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "jni_glue.h"
  2. namespace bbJNI{
  3. bbString JStringToString( JNIEnv *env,jstring jstr ){
  4. const char *cstr=env->GetStringUTFChars( jstr,0 );
  5. bbString str=bbString::fromCString( cstr );
  6. env->ReleaseStringUTFChars( jstr,cstr );
  7. return str;
  8. }
  9. jstring StringToJString( JNIEnv *env,bbString str ){
  10. int n=str.utf8Length()+1;
  11. char *buf=new char[n];
  12. str.toCString( buf,n );
  13. jstring jstr=env->NewStringUTF( buf );
  14. return jstr;
  15. }
  16. jvalue *makeArgs( JNIEnv *env,bbArray<bbVariant> args ){
  17. jvalue *jargs=new jvalue[args.length()];
  18. memset( jargs,0,sizeof( jvalue ) * args.length() );
  19. jvalue *jarg=jargs;
  20. for( int i=0;i<args.length();++i ){
  21. bbVariant arg=args[i];
  22. bbTypeInfo *type=arg.getType();
  23. if( type==bbGetType<bbBool>() ){
  24. bbBool val=arg.get<bbBool>();
  25. jarg->z=val;
  26. }else if( type==bbGetType<bbInt>() ){
  27. bbInt val=arg.get<bbInt>();
  28. jarg->i=val;
  29. }else if( type==bbGetType<bbString>() ){
  30. bbString str=arg.get<bbString>();
  31. int n=str.utf8Length()+1;
  32. char *buf=new char[n];
  33. str.toCString( buf,n );
  34. jstring jstr=env->NewStringUTF( buf );
  35. jarg->l=jstr;
  36. }else{
  37. bbRuntimeError( "Can't evaluate JNI method param of typ:"+type->toString() );
  38. }
  39. ++jarg;
  40. }
  41. return jargs;
  42. }
  43. void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  44. jvalue *jargs=makeArgs( env,args );
  45. env->CallVoidMethodA( obj,methodID,jargs );
  46. delete[] jargs;
  47. }
  48. bbBool CallBooleanMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  49. jvalue *jargs=makeArgs( env,args );
  50. bbBool r=env->CallBooleanMethodA( obj,methodID,jargs );
  51. delete[] jargs;
  52. return r;
  53. }
  54. void CallStaticVoidMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  55. jvalue *jargs=makeArgs( env,args );
  56. env->CallStaticVoidMethodA( clazz,methodID,jargs );
  57. delete[] jargs;
  58. }
  59. bbBool CallStaticBooleanMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  60. jvalue *jargs=makeArgs( env,args );
  61. bbBool r=env->CallStaticBooleanMethodA( clazz,methodID,jargs );
  62. delete[] jargs;
  63. return r;
  64. }
  65. }