- Timestamp:
- Jul 11, 2013 5:35:05 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/jni/pjsip-apps/src/jni/my_typemaps.i
r4549 r4557 4 4 %include "typemaps.i" 5 5 6 /* Add director typemaps for "int *INOUT" */ 6 /* Auto destroy JNI object, useful for director */ 7 %inline %{ 8 class LocalRefGuard { 9 JNIEnv* jenv; 10 jobject jobj; 11 public: 12 LocalRefGuard(JNIEnv* jenv_, jobject jobj_) : jenv(jenv_), jobj(jobj_) {} 13 ~LocalRefGuard() { if (jobj) jenv->DeleteLocalRef(jobj); } 14 }; 15 %} 16 17 /* 18 * Add director typemaps for "int *INOUT" 19 */ 7 20 %typemap(javadirectorin) int *INOUT "$jniinput" 8 21 %typemap(directorin, descriptor="[I") int *INOUT %{ 9 22 $input = jenv->NewIntArray(1); 23 LocalRefGuard g_$input(jenv, $input); 10 24 jenv->SetIntArrayRegion($input, 0, 1, (jint*)$1); 11 25 %} 12 26 %typemap(directorout) int *INOUT %{ 13 jint * tmp$result = jenv->GetIntArrayElements($input, 0);14 *$result = tmp$result[0];15 jenv->ReleaseIntArrayElements($input, tmp$result, JNI_ABORT);27 jint tmp$result; 28 jenv->GetIntArrayRegion($input, 0, 1, &tmp$result); 29 *$result = ($*1_ltype)tmp$result; 16 30 %} 17 31 %typemap(directorargout) int *INOUT %{ 18 jint* tmp$1 = jenv->GetIntArrayElements($input, 0); 19 *$1 = ($*1_ltype) tmp$1[0]; 20 jenv->ReleaseIntArrayElements($input, tmp$1, JNI_ABORT); 21 %} 22 23 /* Add director typemaps for "unsigned *INOUT" */ 32 jint tmp$1; 33 jenv->GetIntArrayRegion($input, 0, 1, &tmp$1); 34 *$1 = ($*1_ltype)tmp$1; 35 %} 36 37 /* 38 * Add director typemaps for "unsigned *INOUT" 39 */ 24 40 %typemap(javadirectorin) unsigned *INOUT "$jniinput" 25 41 %typemap(directorin, descriptor="[I") unsigned *INOUT %{ 26 42 $input = jenv->NewLongArray(1); 43 LocalRefGuard g_$input(jenv, $input); 27 44 jenv->SetLongArrayRegion($input, 0, 1, (jlong*)$1); 28 45 %} 29 46 %typemap(directorout) unsigned *INOUT %{ 30 jlong * tmp$result = jenv->GetLongArrayElements($input, 0);31 *$result = tmp$result[0];32 jenv->ReleaseLongArrayElements($input, tmp$result, JNI_ABORT);47 jlong tmp$result; 48 jenv->GetLongArrayRegion($input, 0, 1, &tmp$result); 49 *$result = ($*1_ltype)tmp$result; 33 50 %} 34 51 %typemap(directorargout) unsigned *INOUT %{ 35 jlong* tmp$1 = jenv->GetLongArrayElements($input, 0); 36 *$1 = ($*1_ltype) tmp$1[0]; 37 jenv->ReleaseLongArrayElements($input, tmp$1, JNI_ABORT); 38 %} 52 jlong tmp$1; 53 jenv->GetLongArrayRegion($input, 0, 1, &tmp$1); 54 *$1 = ($*1_ltype)tmp$1; 55 %} 56 57 /* 58 * Map pj_str_t to java String 59 */ 60 %ignore pj_str_t; 61 %typemap(jni) pj_str_t* "jstring" 62 %typemap(jtype) pj_str_t* "String" 63 %typemap(jstype) pj_str_t* "String" 64 %typemap(javain) pj_str_t* "$javainput" 65 %typemap(javaout) pj_str_t* { return $jnicall; } 66 %typemap(javadirectorin) pj_str_t* "$jniinput" 67 %typemap(javadirectorout) pj_str_t* "$javacall" 68 69 %typemap(in) pj_str_t* (pj_str_t str_tmp, char* str_ptr=NULL) %{ 70 $1 = &str_tmp; 71 if(!$input) pj_strset($1, NULL, 0); 72 else { 73 str_ptr = (char*)jenv->GetStringUTFChars($input, 0); 74 pj_size_t str_len = jenv->GetStringUTFLength($input); 75 if (!str_ptr || !str_len) pj_strset($1, NULL, 0); 76 else pj_strset($1, str_ptr, str_len); 77 } 78 %} 79 80 %typemap(freearg) pj_str_t* %{ 81 if ($input) 82 jenv->ReleaseStringUTFChars($input, str_ptr$argnum); 83 %} 84 85 %typemap(memberin) pj_str_t %{ 86 if ($1.ptr) free($1.ptr); 87 if ($input->ptr) { 88 $1.ptr = (char*)malloc($input->slen); /* <-- will leak! */ 89 memcpy($1.ptr, $input->ptr, $input->slen); 90 $1.slen = $input->slen; 91 } 92 %} 93 94 %typemap(out) pj_str_t* %{ 95 char *$1_ptr = (char*)malloc($1->slen+1); 96 memcpy($1_ptr, $1->ptr, $1->slen); 97 $1_ptr[$1->slen] = '\0'; 98 $result = jenv->NewStringUTF($1_ptr); 99 free($1_ptr); 100 %} 101 102 %typemap(directorin,descriptor="Ljava/lang/String;") pj_str_t* %{ 103 char *$input_ptr = (char*)malloc($1->slen+1); 104 memcpy($input_ptr, $1->ptr, $1->slen); 105 $input_ptr[$1->slen] = '\0'; 106 $input = jenv->NewStringUTF($input_ptr); 107 LocalRefGuard g_$input(jenv, $input); 108 free($input_ptr); 109 %} 110 111 /* 112 * Map pj_str_t[ANY] to java String[] 113 */ 114 %typemap(jni) pj_str_t[ANY] "jobjectArray" 115 %typemap(jtype) pj_str_t[ANY] "String[]" 116 %typemap(jstype) pj_str_t[ANY] "String[]" 117 %typemap(javain) pj_str_t[ANY] "$javainput" 118 %typemap(javaout) pj_str_t[ANY] { return $jnicall; } 119 %typemap(in) pj_str_t[ANY] %{ 120 int $1_len = jenv->GetArrayLength($input); 121 char** $1_tmpstr = new char*[$1_len]; 122 jstring* $1_tmp = new jstring[$1_len]; 123 $1 = new pj_str_t[$1_len]; 124 int $1_ii; 125 for ($1_ii = 0; $1_ii<$1_len; $1_ii++) { 126 $1_tmp[$1_ii] = (jstring)jenv->GetObjectArrayElement($input, $1_ii); 127 if ($1_tmp[$1_ii]) { 128 $1[$1_ii].ptr = $1_tmpstr[$1_ii] = (char*)jenv->GetStringUTFChars($1_tmp[$1_ii], 0); 129 $1[$1_ii].slen = jenv->GetStringUTFLength($1_tmp[$1_ii]); 130 } else { 131 pj_strset(&$1[$1_ii], NULL, 0); 132 } 133 jenv->DeleteLocalRef($1_tmp[$1_ii]); /* is this ok here? */ 134 } 135 %} 136 137 %typemap(freearg) pj_str_t[ANY] %{ 138 for ($1_ii=0; $1_ii<$1_len; $1_ii++) 139 if ($1_tmp[$1_ii]) jenv->ReleaseStringUTFChars($1_tmp[$1_ii], $1_tmpstr[$1_ii]); 140 delete [] $1; 141 delete [] $1_tmp; 142 delete [] $1_tmpstr; 143 %} 144 145 /* 146 * Handle setter/getter of a struct member with type of 'array of pj_str_t'. 147 */ 148 %define MY_JAVA_MEMBER_ARRAY_OF_STR(CLASS_NAME, NAME, COUNT_NAME) 149 150 %ignore CLASS_NAME::COUNT_NAME; 151 152 %typemap(memberin) pj_str_t NAME[ANY], pj_str_t NAME[] { 153 int i; 154 for (i=0; i<arg1->COUNT_NAME; ++i) 155 if ($1[i].ptr) free($1[i].ptr); 156 157 arg1->COUNT_NAME = $input_len; 158 for (i=0; i<arg1->COUNT_NAME; ++i) { 159 if ($input->ptr) { 160 $1[i].ptr = (char*)malloc($input->slen); /* <-- will leak! */ 161 memcpy($1[i].ptr, $input->ptr, $input->slen); 162 $1[i].slen = $input->slen; 163 } 164 } 165 } 166 167 %typemap(out) pj_str_t NAME[ANY] { 168 int i; 169 jstring temp_string; 170 const jclass clazz = jenv->FindClass("java/lang/String"); 171 172 $result = jenv->NewObjectArray(arg1->COUNT_NAME, clazz, NULL); 173 for (i=0; i<arg1->COUNT_NAME; i++) { 174 temp_string = jenv->NewStringUTF($1[i].ptr); 175 jenv->SetObjectArrayElement($result, i, temp_string); 176 jenv->DeleteLocalRef(temp_string); 177 } 178 } 179 180 %enddef 181 182 /* 183 * pj_str_t *INOUT, string as input and output param, handled as single element array. 184 */ 185 %apply pj_str_t[ANY] { pj_str_t *INOUT }; 186 187 %typemap(argout) pj_str_t *INOUT { 188 char *$1_ptr = new char[$1[0].slen+1]; 189 memcpy($1_ptr, $1[0].ptr, $1[0].slen); 190 $1_ptr[$1[0].slen] = '\0'; 191 jstring temp_string = jenv->NewStringUTF($1_ptr); 192 jenv->SetObjectArrayElement($input, 0, temp_string); 193 delete [] $1_ptr; 194 } 195 196 %typemap(directorin,descriptor="[Ljava/lang/String;") pj_str_t *INOUT %{ 197 jstring tmp_$input; 198 $input = jenv->NewObjectArray(1, jenv->FindClass("java/lang/String"), NULL); 199 LocalRefGuard g_$input(jenv, $input); 200 tmp_$input = jenv->NewStringUTF($1[0].ptr); 201 LocalRefGuard g_temp_$input(jenv, tmp_$input); 202 jenv->SetObjectArrayElement($input, 0, tmp_$input); 203 %} 204 205 %typemap(directorargout) pj_str_t *INOUT { 206 if(!$input) pj_strset($1, NULL, 0); 207 else { 208 str_ptr = (char*)jenv->GetStringUTFChars($input, 0); 209 pj_size_t str_len = jenv->GetStringUTFLength($input); 210 if (!str_ptr || !str_len) pj_strset($1, NULL, 0); 211 else { 212 $1->ptr = (char*)malloc(str_len); /* <-- will leak! */ 213 memcpy($1->ptr, str_ptr, str_len); 214 $1->slen = str_len; 215 } 216 } 217 } 218 39 219 40 220 /* … … 45 225 %typemap(jtype) TYPE **NAME "long" 46 226 %typemap(jstype) TYPE **NAME "TYPE" 47 %typemap(in) TYPE **NAME (TYPE *temp = NULL) { temp = (TYPE*)$input; $1 = &temp; }48 %typemap(argout) TYPE **NAME "$input = (jlong)*$1;" 227 %typemap(in) TYPE **NAME (TYPE *temp = NULL) "temp = (TYPE*)$input; $1 = &temp;" 228 %typemap(argout) TYPE **NAME "$input = (jlong)*$1;" 49 229 %typemap(directorin,descriptor="L$packagepath/TYPE;") TYPE **NAME "$input = (jlong)*$1;" 50 %typemap(directorargout) TYPE **NAME " *$1 = (TYPE*)$input; "51 %typemap(javain) TYPE **NAME "TYPE.getCPtr($javainput)"52 %typemap(javadirectorin) TYPE **NAME "($jniinput == 0) ? null : new TYPE($jniinput, false)"230 %typemap(directorargout) TYPE **NAME " *$1 = (TYPE*)$input; " 231 %typemap(javain) TYPE **NAME "TYPE.getCPtr($javainput)" 232 %typemap(javadirectorin) TYPE **NAME "($jniinput == 0) ? null : new TYPE($jniinput, false)" 53 233 %typemap(javadirectorout) TYPE **NAME "TYPE.getCPtr($javacall)" 54 234 %enddef … … 57 237 /* 58 238 * Generate setter/getter of a struct member typed of 'array of enum' with variable length. 59 * Sample usage, given enum array member in this struct:60 * --61 * struct pjsip_tls_setting {62 * ..63 * unsigned ciphers_num;64 * pj_ssl_cipher *ciphers;65 * ..66 * };67 * --68 * apply:69 * MY_JAVA_MEMBER_ARRAY_OF_ENUM(pjsip_tls_setting, pj_ssl_cipher, ciphers, ciphers_num)70 239 */ 71 240 %define MY_JAVA_MEMBER_ARRAY_OF_ENUM(CLASS_NAME, TYPE, NAME, COUNT_NAME) 72 241 73 %apply ARRAYSOFENUMS[] { TYPE* };74 %typemap(out) TYPE* %{ $result = SWIG_JavaArrayOutInt(jenv, (int*)$1, arg1->COUNT_NAME); %}75 %ignore CLASS_NAME::NAME;76 242 %ignore CLASS_NAME::COUNT_NAME; 77 %extend CLASS_NAME { 78 %rename ("%(lowercamelcase)s") set_##NAME; 79 %rename ("%(lowercamelcase)s") get_##NAME; 80 void set_##NAME(TYPE *NAME, int num) { 81 int i; 82 if ($self->NAME) free($self->NAME); 83 $self->NAME = (TYPE*)calloc(num, sizeof(TYPE)); 84 for (i=0; i<num; ++i) $self->NAME[i] = NAME[i]; 85 $self->COUNT_NAME = num; 86 } 87 TYPE* get_##NAME() { 88 return $self->NAME; 89 } 90 ~CLASS_NAME() { 91 if ($self->NAME) free($self->NAME); 92 } 93 }; 243 %apply ARRAYSOFENUMS[] { TYPE* NAME }; 244 245 %typemap(in) TYPE* NAME (jint *jarr) %{ 246 int size$1 = jenv->GetArrayLength($input); 247 if (!SWIG_JavaArrayInInt(jenv, &jarr, (int **)&$1, $input)) return $null; 248 %} 249 250 %typemap(memberin) TYPE* NAME %{ 251 if ($1) free($1); 252 arg1->COUNT_NAME = size$input; 253 $1 = (TYPE*)calloc(arg1->COUNT_NAME, sizeof(TYPE)); /* <-- will leak! */ 254 for (size_t i = 0; i < (size_t)arg1->COUNT_NAME; i++) 255 $1[i] = $input[i]; 256 %} 257 258 %typemap(out) TYPE* NAME %{ 259 $result = SWIG_JavaArrayOutInt(jenv, (int*)$1, arg1->COUNT_NAME); 260 %} 261 262 // Hack for avoiding leak, may not work when another macro defines class destructor too 263 %extend CLASS_NAME { ~CLASS_NAME() { if ($self->NAME) free($self->NAME); } }; 94 264 95 265 %enddef … … 97 267 98 268 /* 99 * Handle getter of a struct member with type of 'array of pointer to struct/class'. 100 * Currently this is applicable for read-only member. 269 * Handle setter/getter of a struct member with type of 'array of pointer to struct/class'. 101 270 */ 102 271 %define MY_JAVA_MEMBER_ARRAY_OF_POINTER(CLASS_NAME, TYPE, NAME, COUNT_NAME) 103 272 104 273 %ignore CLASS_NAME::COUNT_NAME; 105 %immutable CLASS_NAME::NAME; 106 %typemap(jni) TYPE *[ANY] "jlongArray" 107 %typemap(jtype) TYPE *[ANY] "long[]" 108 %typemap(jstype) TYPE *[ANY] "TYPE[]" 109 %typemap(javain) TYPE *[ANY] "TYPE.cArrayUnwrap($javainput)" 110 %typemap(javaout) TYPE *[ANY] {return TYPE.cArrayWrap($jnicall, $owner);} 111 112 // somehow "$result" is not preprocessed in "typemap(ret)", use 'jresult' directly then 113 %typemap(ret) TYPE *[ANY] { 114 jlong *arr; 115 int i; 116 jresult = JCALL1(NewLongArray, jenv, arg1->COUNT_NAME); 117 if (!jresult) { 274 %typemap(jni) TYPE* NAME[ANY] "jlongArray" 275 %typemap(jtype) TYPE* NAME[ANY] "long[]" 276 %typemap(jstype) TYPE* NAME[ANY] "TYPE[]" 277 %typemap(javain) TYPE* NAME[ANY] "TYPE.cArrayUnwrap($javainput)" 278 %typemap(javaout) TYPE* NAME[ANY] {return TYPE.cArrayWrap($jnicall, $owner);} 279 280 %typemap(in) TYPE* NAME[ANY] (jlong *jarr) %{ 281 if (!SWIG_JavaArrayInUlong(jenv, &jarr, (unsigned long**)&$1, $input)) 118 282 return $null; 119 } 120 arr = JCALL2(GetLongArrayElements, jenv, jresult, 0); 121 if (!arr) { 122 return $null; 123 } 124 for (i=0; i<arg1->COUNT_NAME; i++) { 125 arr[i] = 0; 126 *($1_ltype)&arr[i] = $1[i]; 127 } 128 JCALL3(ReleaseLongArrayElements, jenv, jresult, arr, 0); 129 } 283 arg1->COUNT_NAME = jenv->GetArrayLength($input); 284 %} 285 286 %typemap(freearg) TYPE* NAME[ANY] %{ if ($1) delete [] $1; %} 287 288 %typemap(memberin) TYPE* NAME[ANY] %{ 289 for (size_t i = 0; i < (size_t)arg1->COUNT_NAME; i++) $1[i] = $input[i]; 290 %} 291 292 %typemap(out) TYPE* NAME[ANY] %{ 293 $result = SWIG_JavaArrayOutUlong(jenv, (unsigned long*)$1, arg1->COUNT_NAME); 294 %} 130 295 131 296 %typemap(javacode) TYPE %{ 132 297 protected static long[] cArrayUnwrap($javaclassname[] arrayWrapper) { 133 134 135 136 298 long[] cArray = new long[arrayWrapper.length]; 299 for (int i=0; i<arrayWrapper.length; i++) 300 cArray[i] = $javaclassname.getCPtr(arrayWrapper[i]); 301 return cArray; 137 302 } 138 303 protected static $javaclassname[] cArrayWrap(long[] cArray, boolean cMemoryOwn) {
Note: See TracChangeset
for help on using the changeset viewer.