jni_glue.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. #include "jni_glue.h"
  2. namespace bbJNI{
  3. //64 params max
  4. const int MAX_LOCAL_REFS=64;
  5. jobject local_refs[MAX_LOCAL_REFS];
  6. int num_local_refs=0;
  7. void AddLocalRef( jobject jobj ){
  8. if( num_local_refs==MAX_LOCAL_REFS ) return;
  9. local_refs[num_local_refs++]=jobj;
  10. }
  11. void DeleteLocalRefs( JNIEnv *env ){
  12. while( num_local_refs ){
  13. jobject jobj=local_refs[--num_local_refs];
  14. env->DeleteLocalRef( jobj );
  15. }
  16. }
  17. // ***** Utility *****
  18. bbString JStringToString( JNIEnv *env,jstring jstr ){
  19. if( !jstr ) return "";
  20. const char *cstr=env->GetStringUTFChars( jstr,0 );
  21. bbString str=bbString::fromCString( cstr );
  22. env->ReleaseStringUTFChars( jstr,cstr );
  23. return str;
  24. }
  25. jstring StringToJString( JNIEnv *env,bbString str ){
  26. int n=str.utf8Length()+1;
  27. char *buf=new char[n];
  28. str.toCString( buf,n );
  29. jstring jstr=env->NewStringUTF( buf );
  30. return jstr;
  31. }
  32. jvalue *makeArgs( JNIEnv *env,bbArray<bbVariant> args ){
  33. jvalue *jargs=new jvalue[args.length()];
  34. memset( jargs,0,sizeof( jvalue ) * args.length() );
  35. jvalue *jarg=jargs;
  36. for( int i=0;i<args.length();++i ){
  37. bbVariant arg=args[i];
  38. bbTypeInfo *type=arg.getType();
  39. if( type==bbGetType<bbBool>() ){
  40. bbBool val=arg.get<bbBool>();
  41. jarg->z=val;
  42. }else if( type==bbGetType<bbInt>() ){
  43. bbInt val=arg.get<bbInt>();
  44. jarg->i=val;
  45. }else if( type==bbGetType<bbFloat>() ){
  46. bbFloat val=arg.get<bbFloat>();
  47. jarg->f=val;
  48. }else if( type==bbGetType<bbDouble>() ){
  49. bbDouble val=arg.get<bbDouble>();
  50. jarg->d=val;
  51. }else if( type==bbGetType<bbString>() ){
  52. bbString str=arg.get<bbString>();
  53. jstring jstr=StringToJString( env,str );
  54. AddLocalRef( (jobject)jstr );
  55. jarg->l=jstr;
  56. }else if( type==bbGetType<jobject>() ){
  57. jobject jobj=arg.get<jobject>();
  58. jarg->l=jobj;
  59. /*
  60. }else if( type==bbGetType<bbArray<bbBool>>() ){
  61. bbArray<bbBool> arr=arg.get<bbArray<bbBool>>();
  62. jbooleanArray jarr=env->NewBooleanArray( arr.length() );
  63. jboolean *jdata=env->GetBooleanArrayElements( jarr,0 );
  64. memcpy( jdata,arr.data(),arr.length()*sizeof(bbBool) );
  65. env->ReleaseBooleanArrayElements( jarr,jdata,0 );
  66. jarg->l=(jobject)jarr;
  67. }else if( type==bbGetType<bbArray<bbInt>>() ){
  68. bbArray<bbInt> arr=arg.get<bbArray<bbInt>>();
  69. jintArray jarr=env->NewIntArray( arr.length() );
  70. jint *jdata=env->GetIntArrayElements( jarr,0 );
  71. memcpy( jdata,arr.data(),arr.length()*sizeof(bbInt) );
  72. env->ReleaseIntArrayElements( jarr,jdata,0 );
  73. jarg->l=(jobject)jarr;
  74. }else if( type==bbGetType<bbArray<jobject>>() ){
  75. }else if( type==bbGetType<bbArray<bbString>>() ){
  76. */
  77. }else{
  78. bbRuntimeError( "Can't evaluate JNI method param of typ:"+type->toString() );
  79. }
  80. ++jarg;
  81. }
  82. return jargs;
  83. }
  84. // ***** Instance fields *****
  85. bbString GetStringField( JNIEnv *env,jobject obj,jfieldID fieldID ){
  86. jstring jstr=(jstring)env->GetObjectField( obj,fieldID );
  87. bbString r=JStringToString( env,jstr );
  88. env->DeleteLocalRef( jstr );
  89. return r;
  90. }
  91. // ***** Static fields *****
  92. bbString GetStaticStringField( JNIEnv *env,jclass clazz,jfieldID fieldID ){
  93. jstring jstr=(jstring)env->GetStaticObjectField( clazz,fieldID );
  94. bbString r=JStringToString( env,jstr );
  95. env->DeleteLocalRef( jstr );
  96. return r;
  97. }
  98. // ***** Instance methods *****
  99. void CallVoidMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  100. jvalue *jargs=makeArgs( env,args );
  101. env->CallVoidMethodA( obj,methodID,jargs );
  102. DeleteLocalRefs( env );
  103. delete[] jargs;
  104. }
  105. bbBool CallBooleanMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  106. jvalue *jargs=makeArgs( env,args );
  107. bbBool r=env->CallBooleanMethodA( obj,methodID,jargs );
  108. DeleteLocalRefs( env );
  109. delete[] jargs;
  110. return r;
  111. }
  112. bbInt CallIntMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  113. jvalue *jargs=makeArgs( env,args );
  114. bbInt r=env->CallIntMethodA( obj,methodID,jargs );
  115. DeleteLocalRefs( env );
  116. delete[] jargs;
  117. return r;
  118. }
  119. bbFloat CallFloatMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  120. jvalue *jargs=makeArgs( env,args );
  121. bbFloat r=env->CallFloatMethodA( obj,methodID,jargs );
  122. DeleteLocalRefs( env );
  123. delete[] jargs;
  124. return r;
  125. }
  126. bbDouble CallDoubleMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  127. jvalue *jargs=makeArgs( env,args );
  128. bbDouble r=env->CallDoubleMethodA( obj,methodID,jargs );
  129. DeleteLocalRefs( env );
  130. delete[] jargs;
  131. return r;
  132. }
  133. bbString CallStringMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  134. jvalue *jargs=makeArgs( env,args );
  135. jstring jstr=(jstring)env->CallObjectMethodA( obj,methodID,jargs );
  136. bbString r=JStringToString( env,jstr );
  137. env->DeleteLocalRef( jstr );
  138. DeleteLocalRefs( env );
  139. delete[] jargs;
  140. return r;
  141. }
  142. jobject CallObjectMethod( JNIEnv *env,jobject obj,jmethodID methodID,bbArray<bbVariant> args ){
  143. jvalue *jargs=makeArgs( env,args );
  144. jobject r=env->CallObjectMethodA( obj,methodID,jargs );
  145. DeleteLocalRefs( env );
  146. delete[] jargs;
  147. return r;
  148. }
  149. // ***** Static methods *****
  150. void CallStaticVoidMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  151. jvalue *jargs=makeArgs( env,args );
  152. env->CallStaticVoidMethodA( clazz,methodID,jargs );
  153. DeleteLocalRefs( env );
  154. delete[] jargs;
  155. }
  156. bbBool CallStaticBooleanMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  157. jvalue *jargs=makeArgs( env,args );
  158. bbBool r=env->CallStaticBooleanMethodA( clazz,methodID,jargs );
  159. DeleteLocalRefs( env );
  160. delete[] jargs;
  161. return r;
  162. }
  163. bbInt CallStaticIntMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  164. jvalue *jargs=makeArgs( env,args );
  165. bbInt r=env->CallStaticIntMethodA( clazz,methodID,jargs );
  166. DeleteLocalRefs( env );
  167. delete[] jargs;
  168. return r;
  169. }
  170. bbFloat CallStaticFloatMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  171. jvalue *jargs=makeArgs( env,args );
  172. bbFloat r=env->CallStaticFloatMethodA( clazz,methodID,jargs );
  173. DeleteLocalRefs( env );
  174. delete[] jargs;
  175. return r;
  176. }
  177. bbDouble CallStaticDoubleMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  178. jvalue *jargs=makeArgs( env,args );
  179. bbDouble r=env->CallStaticDoubleMethodA( clazz,methodID,jargs );
  180. DeleteLocalRefs( env );
  181. delete[] jargs;
  182. return r;
  183. }
  184. bbString CallStaticStringMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  185. jvalue *jargs=makeArgs( env,args );
  186. jstring jstr=(jstring)env->CallStaticObjectMethodA( clazz,methodID,jargs );
  187. bbString r=JStringToString( env,jstr );
  188. env->DeleteLocalRef( jstr );
  189. DeleteLocalRefs( env );
  190. delete[] jargs;
  191. return r;
  192. }
  193. jobject CallStaticObjectMethod( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  194. jvalue *jargs=makeArgs( env,args );
  195. jobject r=env->CallStaticObjectMethodA( clazz,methodID,jargs );
  196. DeleteLocalRefs( env );
  197. delete[] jargs;
  198. return r;
  199. }
  200. // ***** ctors *****
  201. jobject NewObject( JNIEnv *env,jclass clazz,jmethodID methodID,bbArray<bbVariant> args ){
  202. jvalue *jargs=makeArgs( env,args );
  203. jobject r=env->NewObjectA( clazz,methodID,jargs );
  204. DeleteLocalRefs( env );
  205. delete[] jargs;
  206. return r;
  207. }
  208. }