SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact 478b5098bab85bad51707bad80f5ee9c34f816c9:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 32 30 30 36 20 54 68 65 20 41 6e 64  (C) 2006 The And
0020: 72 6f 69 64 20 4f 70 65 6e 20 53 6f 75 72 63 65  roid Open Source
0030: 20 50 72 6f 6a 65 63 74 0a 20 2a 0a 20 2a 20 4c   Project. *. * L
0040: 69 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68  icensed under th
0050: 65 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65  e Apache License
0060: 2c 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 28 74  , Version 2.0 (t
0070: 68 65 20 22 4c 69 63 65 6e 73 65 22 29 3b 0a 20  he "License");. 
0080: 2a 20 79 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73  * you may not us
0090: 65 20 74 68 69 73 20 66 69 6c 65 20 65 78 63 65  e this file exce
00a0: 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65  pt in compliance
00b0: 20 77 69 74 68 20 74 68 65 20 4c 69 63 65 6e 73   with the Licens
00c0: 65 2e 0a 20 2a 20 59 6f 75 20 6d 61 79 20 6f 62  e.. * You may ob
00d0: 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  tain a copy of t
00e0: 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20 2a  he License at. *
00f0: 0a 20 2a 20 20 20 20 20 20 68 74 74 70 3a 2f 2f  . *      http://
0100: 77 77 77 2e 61 70 61 63 68 65 2e 6f 72 67 2f 6c  www.apache.org/l
0110: 69 63 65 6e 73 65 73 2f 4c 49 43 45 4e 53 45 2d  icenses/LICENSE-
0120: 32 2e 30 0a 20 2a 0a 20 2a 20 55 6e 6c 65 73 73  2.0. *. * Unless
0130: 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70 70   required by app
0140: 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61  licable law or a
0150: 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74  greed to in writ
0160: 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a 20 2a  ing, software. *
0170: 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64   distributed und
0180: 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20 69  er the License i
0190: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 6e  s distributed on
01a0: 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 53 49   an "AS IS" BASI
01b0: 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 57 41  S,. * WITHOUT WA
01c0: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
01d0: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b 49  ITIONS OF ANY KI
01e0: 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 65  ND, either expre
01f0: 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a 20  ss or implied.. 
0200: 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73  * See the Licens
0210: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  e for the specif
0220: 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65  ic language gove
0230: 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e  rning permission
0240: 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 61 74  s and. * limitat
0250: 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 20 4c  ions under the L
0260: 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 0a 23 64 65  icense.. */..#de
0270: 66 69 6e 65 20 4c 4f 47 5f 54 41 47 20 22 4a 4e  fine LOG_TAG "JN
0280: 49 48 65 6c 70 22 0a 0a 23 69 6e 63 6c 75 64 65  IHelp"..#include
0290: 20 22 4a 6e 69 43 6f 6e 73 74 61 6e 74 73 2e 68   "JniConstants.h
02a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 4a 4e 49 48  ".#include "JNIH
02b0: 65 6c 70 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  elp.h".#include 
02c0: 22 41 4c 6f 67 2d 70 72 69 76 2e 68 22 0a 0a 23  "ALog-priv.h"..#
02d0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
02e0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
02f0: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0300: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0310: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23  de <assert.h>..#
0320: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 3e  include <string>
0330: 0a 0a 2f 2a 2a 0a 20 2a 20 45 71 75 69 76 61 6c  ../**. * Equival
0340: 65 6e 74 20 74 6f 20 53 63 6f 70 65 64 4c 6f 63  ent to ScopedLoc
0350: 61 6c 52 65 66 2c 20 62 75 74 20 66 6f 72 20 43  alRef, but for C
0360: 5f 4a 4e 49 45 6e 76 20 69 6e 73 74 65 61 64 2e  _JNIEnv instead.
0370: 20 28 41 6e 64 20 73 6c 69 67 68 74 6c 79 20 6d   (And slightly m
0380: 6f 72 65 20 70 6f 77 65 72 66 75 6c 2e 29 0a 20  ore powerful.). 
0390: 2a 2f 0a 74 65 6d 70 6c 61 74 65 3c 74 79 70 65  */.template<type
03a0: 6e 61 6d 65 20 54 3e 0a 63 6c 61 73 73 20 73 63  name T>.class sc
03b0: 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72 65 66 20 7b  oped_local_ref {
03c0: 0a 70 75 62 6c 69 63 3a 0a 20 20 20 20 73 63 6f  .public:.    sco
03d0: 70 65 64 5f 6c 6f 63 61 6c 5f 72 65 66 28 43 5f  ped_local_ref(C_
03e0: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 54 20 6c  JNIEnv* env, T l
03f0: 6f 63 61 6c 52 65 66 20 3d 20 4e 55 4c 4c 29 0a  ocalRef = NULL).
0400: 20 20 20 20 3a 20 6d 45 6e 76 28 65 6e 76 29 2c      : mEnv(env),
0410: 20 6d 4c 6f 63 61 6c 52 65 66 28 6c 6f 63 61 6c   mLocalRef(local
0420: 52 65 66 29 0a 20 20 20 20 7b 0a 20 20 20 20 7d  Ref).    {.    }
0430: 0a 0a 20 20 20 20 7e 73 63 6f 70 65 64 5f 6c 6f  ..    ~scoped_lo
0440: 63 61 6c 5f 72 65 66 28 29 20 7b 0a 20 20 20 20  cal_ref() {.    
0450: 20 20 20 20 72 65 73 65 74 28 29 3b 0a 20 20 20      reset();.   
0460: 20 7d 0a 0a 20 20 20 20 76 6f 69 64 20 72 65 73   }..    void res
0470: 65 74 28 54 20 6c 6f 63 61 6c 52 65 66 20 3d 20  et(T localRef = 
0480: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
0490: 69 66 20 28 6d 4c 6f 63 61 6c 52 65 66 20 21 3d  if (mLocalRef !=
04a0: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20   NULL) {.       
04b0: 20 20 20 20 20 28 2a 6d 45 6e 76 29 2d 3e 44 65       (*mEnv)->De
04c0: 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28 72 65 69  leteLocalRef(rei
04d0: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 4a 4e  nterpret_cast<JN
04e0: 49 45 6e 76 2a 3e 28 6d 45 6e 76 29 2c 20 6d 4c  IEnv*>(mEnv), mL
04f0: 6f 63 61 6c 52 65 66 29 3b 0a 20 20 20 20 20 20  ocalRef);.      
0500: 20 20 20 20 20 20 6d 4c 6f 63 61 6c 52 65 66 20        mLocalRef 
0510: 3d 20 6c 6f 63 61 6c 52 65 66 3b 0a 20 20 20 20  = localRef;.    
0520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
0530: 20 54 20 67 65 74 28 29 20 63 6f 6e 73 74 20 7b   T get() const {
0540: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0550: 6d 4c 6f 63 61 6c 52 65 66 3b 0a 20 20 20 20 7d  mLocalRef;.    }
0560: 0a 0a 70 72 69 76 61 74 65 3a 0a 20 20 20 20 43  ..private:.    C
0570: 5f 4a 4e 49 45 6e 76 2a 20 6d 45 6e 76 3b 0a 20  _JNIEnv* mEnv;. 
0580: 20 20 20 54 20 6d 4c 6f 63 61 6c 52 65 66 3b 0a     T mLocalRef;.
0590: 0a 20 20 20 20 2f 2f 20 44 69 73 61 6c 6c 6f 77  .    // Disallow
05a0: 20 63 6f 70 79 20 61 6e 64 20 61 73 73 69 67 6e   copy and assign
05b0: 6d 65 6e 74 2e 0a 20 20 20 20 73 63 6f 70 65 64  ment..    scoped
05c0: 5f 6c 6f 63 61 6c 5f 72 65 66 28 63 6f 6e 73 74  _local_ref(const
05d0: 20 73 63 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72 65   scoped_local_re
05e0: 66 26 29 3b 0a 20 20 20 20 76 6f 69 64 20 6f 70  f&);.    void op
05f0: 65 72 61 74 6f 72 3d 28 63 6f 6e 73 74 20 73 63  erator=(const sc
0600: 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72 65 66 26 29  oped_local_ref&)
0610: 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 6a 63 6c  ;.};..static jcl
0620: 61 73 73 20 66 69 6e 64 43 6c 61 73 73 28 43 5f  ass findClass(C_
0630: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 63 6f 6e  JNIEnv* env, con
0640: 73 74 20 63 68 61 72 2a 20 63 6c 61 73 73 4e 61  st char* classNa
0650: 6d 65 29 20 7b 0a 20 20 20 20 4a 4e 49 45 6e 76  me) {.    JNIEnv
0660: 2a 20 65 20 3d 20 72 65 69 6e 74 65 72 70 72 65  * e = reinterpre
0670: 74 5f 63 61 73 74 3c 4a 4e 49 45 6e 76 2a 3e 28  t_cast<JNIEnv*>(
0680: 65 6e 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  env);.    return
0690: 20 28 2a 65 6e 76 29 2d 3e 46 69 6e 64 43 6c 61   (*env)->FindCla
06a0: 73 73 28 65 2c 20 63 6c 61 73 73 4e 61 6d 65 29  ss(e, className)
06b0: 3b 0a 7d 0a 0a 65 78 74 65 72 6e 20 22 43 22 20  ;.}..extern "C" 
06c0: 69 6e 74 20 6a 6e 69 52 65 67 69 73 74 65 72 4e  int jniRegisterN
06d0: 61 74 69 76 65 4d 65 74 68 6f 64 73 28 43 5f 4a  ativeMethods(C_J
06e0: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 63 6f 6e 73  NIEnv* env, cons
06f0: 74 20 63 68 61 72 2a 20 63 6c 61 73 73 4e 61 6d  t char* classNam
0700: 65 2c 0a 20 20 20 20 63 6f 6e 73 74 20 4a 4e 49  e,.    const JNI
0710: 4e 61 74 69 76 65 4d 65 74 68 6f 64 2a 20 67 4d  NativeMethod* gM
0720: 65 74 68 6f 64 73 2c 20 69 6e 74 20 6e 75 6d 4d  ethods, int numM
0730: 65 74 68 6f 64 73 29 0a 7b 0a 20 20 20 20 4a 4e  ethods).{.    JN
0740: 49 45 6e 76 2a 20 65 20 3d 20 72 65 69 6e 74 65  IEnv* e = reinte
0750: 72 70 72 65 74 5f 63 61 73 74 3c 4a 4e 49 45 6e  rpret_cast<JNIEn
0760: 76 2a 3e 28 65 6e 76 29 3b 0a 0a 20 20 20 20 41  v*>(env);..    A
0770: 4c 4f 47 56 28 22 52 65 67 69 73 74 65 72 69 6e  LOGV("Registerin
0780: 67 20 25 73 27 73 20 25 64 20 6e 61 74 69 76 65  g %s's %d native
0790: 20 6d 65 74 68 6f 64 73 2e 2e 2e 22 2c 20 63 6c   methods...", cl
07a0: 61 73 73 4e 61 6d 65 2c 20 6e 75 6d 4d 65 74 68  assName, numMeth
07b0: 6f 64 73 29 3b 0a 20 20 20 20 5f 5f 61 6e 64 72  ods);.    __andr
07c0: 6f 69 64 5f 6c 6f 67 5f 70 72 69 6e 74 28 41 4e  oid_log_print(AN
07d0: 44 52 4f 49 44 5f 4c 4f 47 5f 49 4e 46 4f 2c 20  DROID_LOG_INFO, 
07e0: 20 5f 5f 46 55 4e 43 54 49 4f 4e 5f 5f 2c 20 22   __FUNCTION__, "
07f0: 52 65 67 69 73 74 65 72 69 6e 67 22 29 3b 0a 0a  Registering");..
0800: 20 20 20 20 73 63 6f 70 65 64 5f 6c 6f 63 61 6c      scoped_local
0810: 5f 72 65 66 3c 6a 63 6c 61 73 73 3e 20 63 28 65  _ref<jclass> c(e
0820: 6e 76 2c 20 66 69 6e 64 43 6c 61 73 73 28 65 6e  nv, findClass(en
0830: 76 2c 20 63 6c 61 73 73 4e 61 6d 65 29 29 3b 0a  v, className));.
0840: 20 20 20 20 69 66 20 28 63 2e 67 65 74 28 29 20      if (c.get() 
0850: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20  == NULL) {.     
0860: 20 20 20 63 68 61 72 2a 20 6d 73 67 3b 0a 20 20     char* msg;.  
0870: 20 20 20 20 20 20 61 73 70 72 69 6e 74 66 28 26        asprintf(&
0880: 6d 73 67 2c 20 22 4e 61 74 69 76 65 20 72 65 67  msg, "Native reg
0890: 69 73 74 72 61 74 69 6f 6e 20 75 6e 61 62 6c 65  istration unable
08a0: 20 74 6f 20 66 69 6e 64 20 63 6c 61 73 73 20 27   to find class '
08b0: 25 73 27 3b 20 61 62 6f 72 74 69 6e 67 2e 2e 2e  %s'; aborting...
08c0: 22 2c 20 63 6c 61 73 73 4e 61 6d 65 29 3b 0a 20  ", className);. 
08d0: 20 20 20 20 20 20 20 65 2d 3e 46 61 74 61 6c 45         e->FatalE
08e0: 72 72 6f 72 28 6d 73 67 29 3b 0a 20 20 20 20 7d  rror(msg);.    }
08f0: 0a 0a 20 20 20 20 69 66 20 28 28 2a 65 6e 76 29  ..    if ((*env)
0900: 2d 3e 52 65 67 69 73 74 65 72 4e 61 74 69 76 65  ->RegisterNative
0910: 73 28 65 2c 20 63 2e 67 65 74 28 29 2c 20 67 4d  s(e, c.get(), gM
0920: 65 74 68 6f 64 73 2c 20 6e 75 6d 4d 65 74 68 6f  ethods, numMetho
0930: 64 73 29 20 3c 20 30 29 20 7b 0a 20 20 20 20 20  ds) < 0) {.     
0940: 20 20 20 63 68 61 72 2a 20 6d 73 67 3b 0a 20 20     char* msg;.  
0950: 20 20 20 20 20 20 61 73 70 72 69 6e 74 66 28 26        asprintf(&
0960: 6d 73 67 2c 20 22 52 65 67 69 73 74 65 72 4e 61  msg, "RegisterNa
0970: 74 69 76 65 73 20 66 61 69 6c 65 64 20 66 6f 72  tives failed for
0980: 20 27 25 73 27 3b 20 61 62 6f 72 74 69 6e 67 2e   '%s'; aborting.
0990: 2e 2e 22 2c 20 63 6c 61 73 73 4e 61 6d 65 29 3b  ..", className);
09a0: 0a 20 20 20 20 20 20 20 20 65 2d 3e 46 61 74 61  .        e->Fata
09b0: 6c 45 72 72 6f 72 28 6d 73 67 29 3b 0a 20 20 20  lError(msg);.   
09c0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 30   }..    return 0
09d0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 52 65 74 75 72  ;.}../*. * Retur
09e0: 6e 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ns a human-reada
09f0: 62 6c 65 20 73 75 6d 6d 61 72 79 20 6f 66 20 61  ble summary of a
0a00: 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 62 6a 65  n exception obje
0a10: 63 74 2e 20 20 54 68 65 20 62 75 66 66 65 72 20  ct.  The buffer 
0a20: 77 69 6c 6c 0a 20 2a 20 62 65 20 70 6f 70 75 6c  will. * be popul
0a30: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 22 62  ated with the "b
0a40: 69 6e 61 72 79 22 20 63 6c 61 73 73 20 6e 61 6d  inary" class nam
0a50: 65 20 61 6e 64 2c 20 69 66 20 70 72 65 73 65 6e  e and, if presen
0a60: 74 2c 20 74 68 65 0a 20 2a 20 65 78 63 65 70 74  t, the. * except
0a70: 69 6f 6e 20 6d 65 73 73 61 67 65 2e 0a 20 2a 2f  ion message.. */
0a80: 0a 73 74 61 74 69 63 20 62 6f 6f 6c 20 67 65 74  .static bool get
0a90: 45 78 63 65 70 74 69 6f 6e 53 75 6d 6d 61 72 79  ExceptionSummary
0aa0: 28 43 5f 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20  (C_JNIEnv* env, 
0ab0: 6a 74 68 72 6f 77 61 62 6c 65 20 65 78 63 65 70  jthrowable excep
0ac0: 74 69 6f 6e 2c 20 73 74 64 3a 3a 73 74 72 69 6e  tion, std::strin
0ad0: 67 26 20 72 65 73 75 6c 74 29 20 7b 0a 20 20 20  g& result) {.   
0ae0: 20 4a 4e 49 45 6e 76 2a 20 65 20 3d 20 72 65 69   JNIEnv* e = rei
0af0: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 4a 4e  nterpret_cast<JN
0b00: 49 45 6e 76 2a 3e 28 65 6e 76 29 3b 0a 0a 20 20  IEnv*>(env);..  
0b10: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 6e 61 6d    /* get the nam
0b20: 65 20 6f 66 20 74 68 65 20 65 78 63 65 70 74 69  e of the excepti
0b30: 6f 6e 27 73 20 63 6c 61 73 73 20 2a 2f 0a 20 20  on's class */.  
0b40: 20 20 73 63 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72    scoped_local_r
0b50: 65 66 3c 6a 63 6c 61 73 73 3e 20 65 78 63 65 70  ef<jclass> excep
0b60: 74 69 6f 6e 43 6c 61 73 73 28 65 6e 76 2c 20 28  tionClass(env, (
0b70: 2a 65 6e 76 29 2d 3e 47 65 74 4f 62 6a 65 63 74  *env)->GetObject
0b80: 43 6c 61 73 73 28 65 2c 20 65 78 63 65 70 74 69  Class(e, excepti
0b90: 6f 6e 29 29 3b 20 2f 2f 20 63 61 6e 27 74 20 66  on)); // can't f
0ba0: 61 69 6c 0a 20 20 20 20 73 63 6f 70 65 64 5f 6c  ail.    scoped_l
0bb0: 6f 63 61 6c 5f 72 65 66 3c 6a 63 6c 61 73 73 3e  ocal_ref<jclass>
0bc0: 20 63 6c 61 73 73 43 6c 61 73 73 28 65 6e 76 2c   classClass(env,
0bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 2a 65  .            (*e
0be0: 6e 76 29 2d 3e 47 65 74 4f 62 6a 65 63 74 43 6c  nv)->GetObjectCl
0bf0: 61 73 73 28 65 2c 20 65 78 63 65 70 74 69 6f 6e  ass(e, exception
0c00: 43 6c 61 73 73 2e 67 65 74 28 29 29 29 3b 20 2f  Class.get())); /
0c10: 2f 20 6a 61 76 61 2e 6c 61 6e 67 2e 43 6c 61 73  / java.lang.Clas
0c20: 73 2c 20 63 61 6e 27 74 20 66 61 69 6c 0a 20 20  s, can't fail.  
0c30: 20 20 6a 6d 65 74 68 6f 64 49 44 20 63 6c 61 73    jmethodID clas
0c40: 73 47 65 74 4e 61 6d 65 4d 65 74 68 6f 64 20 3d  sGetNameMethod =
0c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 2a 65  .            (*e
0c60: 6e 76 29 2d 3e 47 65 74 4d 65 74 68 6f 64 49 44  nv)->GetMethodID
0c70: 28 65 2c 20 63 6c 61 73 73 43 6c 61 73 73 2e 67  (e, classClass.g
0c80: 65 74 28 29 2c 20 22 67 65 74 4e 61 6d 65 22 2c  et(), "getName",
0c90: 20 22 28 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53   "()Ljava/lang/S
0ca0: 74 72 69 6e 67 3b 22 29 3b 0a 20 20 20 20 73 63  tring;");.    sc
0cb0: 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72 65 66 3c 6a  oped_local_ref<j
0cc0: 73 74 72 69 6e 67 3e 20 63 6c 61 73 73 4e 61 6d  string> classNam
0cd0: 65 53 74 72 28 65 6e 76 2c 0a 20 20 20 20 20 20  eStr(env,.      
0ce0: 20 20 20 20 20 20 28 6a 73 74 72 69 6e 67 29 20        (jstring) 
0cf0: 28 2a 65 6e 76 29 2d 3e 43 61 6c 6c 4f 62 6a 65  (*env)->CallObje
0d00: 63 74 4d 65 74 68 6f 64 28 65 2c 20 65 78 63 65  ctMethod(e, exce
0d10: 70 74 69 6f 6e 43 6c 61 73 73 2e 67 65 74 28 29  ptionClass.get()
0d20: 2c 20 63 6c 61 73 73 47 65 74 4e 61 6d 65 4d 65  , classGetNameMe
0d30: 74 68 6f 64 29 29 3b 0a 20 20 20 20 69 66 20 28  thod));.    if (
0d40: 63 6c 61 73 73 4e 61 6d 65 53 74 72 2e 67 65 74  classNameStr.get
0d50: 28 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  () == NULL) {.  
0d60: 20 20 20 20 20 20 28 2a 65 6e 76 29 2d 3e 45 78        (*env)->Ex
0d70: 63 65 70 74 69 6f 6e 43 6c 65 61 72 28 65 29 3b  ceptionClear(e);
0d80: 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
0d90: 3d 20 22 3c 65 72 72 6f 72 20 67 65 74 74 69 6e  = "<error gettin
0da0: 67 20 63 6c 61 73 73 20 6e 61 6d 65 3e 22 3b 0a  g class name>";.
0db0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
0dc0: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
0dd0: 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6c 61 73  const char* clas
0de0: 73 4e 61 6d 65 43 68 61 72 73 20 3d 20 28 2a 65  sNameChars = (*e
0df0: 6e 76 29 2d 3e 47 65 74 53 74 72 69 6e 67 55 54  nv)->GetStringUT
0e00: 46 43 68 61 72 73 28 65 2c 20 63 6c 61 73 73 4e  FChars(e, classN
0e10: 61 6d 65 53 74 72 2e 67 65 74 28 29 2c 20 4e 55  ameStr.get(), NU
0e20: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6c 61  LL);.    if (cla
0e30: 73 73 4e 61 6d 65 43 68 61 72 73 20 3d 3d 20 4e  ssNameChars == N
0e40: 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 28  ULL) {.        (
0e50: 2a 65 6e 76 29 2d 3e 45 78 63 65 70 74 69 6f 6e  *env)->Exception
0e60: 43 6c 65 61 72 28 65 29 3b 0a 20 20 20 20 20 20  Clear(e);.      
0e70: 20 20 72 65 73 75 6c 74 20 3d 20 22 3c 65 72 72    result = "<err
0e80: 6f 72 20 67 65 74 74 69 6e 67 20 63 6c 61 73 73  or getting class
0e90: 20 6e 61 6d 65 20 55 54 46 2d 38 3e 22 3b 0a 20   name UTF-8>";. 
0ea0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
0eb0: 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  lse;.    }.    r
0ec0: 65 73 75 6c 74 20 2b 3d 20 63 6c 61 73 73 4e 61  esult += classNa
0ed0: 6d 65 43 68 61 72 73 3b 0a 20 20 20 20 28 2a 65  meChars;.    (*e
0ee0: 6e 76 29 2d 3e 52 65 6c 65 61 73 65 53 74 72 69  nv)->ReleaseStri
0ef0: 6e 67 55 54 46 43 68 61 72 73 28 65 2c 20 63 6c  ngUTFChars(e, cl
0f00: 61 73 73 4e 61 6d 65 53 74 72 2e 67 65 74 28 29  assNameStr.get()
0f10: 2c 20 63 6c 61 73 73 4e 61 6d 65 43 68 61 72 73  , classNameChars
0f20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 69 66 20 74 68  );..    /* if th
0f30: 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 73 20  e exception has 
0f40: 61 20 64 65 74 61 69 6c 20 6d 65 73 73 61 67 65  a detail message
0f50: 2c 20 67 65 74 20 74 68 61 74 20 2a 2f 0a 20 20  , get that */.  
0f60: 20 20 6a 6d 65 74 68 6f 64 49 44 20 67 65 74 4d    jmethodID getM
0f70: 65 73 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  essage =.       
0f80: 20 20 20 20 20 28 2a 65 6e 76 29 2d 3e 47 65 74       (*env)->Get
0f90: 4d 65 74 68 6f 64 49 44 28 65 2c 20 65 78 63 65  MethodID(e, exce
0fa0: 70 74 69 6f 6e 43 6c 61 73 73 2e 67 65 74 28 29  ptionClass.get()
0fb0: 2c 20 22 67 65 74 4d 65 73 73 61 67 65 22 2c 20  , "getMessage", 
0fc0: 22 28 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74  "()Ljava/lang/St
0fd0: 72 69 6e 67 3b 22 29 3b 0a 20 20 20 20 73 63 6f  ring;");.    sco
0fe0: 70 65 64 5f 6c 6f 63 61 6c 5f 72 65 66 3c 6a 73  ped_local_ref<js
0ff0: 74 72 69 6e 67 3e 20 6d 65 73 73 61 67 65 53 74  tring> messageSt
1000: 72 28 65 6e 76 2c 0a 20 20 20 20 20 20 20 20 20  r(env,.         
1010: 20 20 20 28 6a 73 74 72 69 6e 67 29 20 28 2a 65     (jstring) (*e
1020: 6e 76 29 2d 3e 43 61 6c 6c 4f 62 6a 65 63 74 4d  nv)->CallObjectM
1030: 65 74 68 6f 64 28 65 2c 20 65 78 63 65 70 74 69  ethod(e, excepti
1040: 6f 6e 2c 20 67 65 74 4d 65 73 73 61 67 65 29 29  on, getMessage))
1050: 3b 0a 20 20 20 20 69 66 20 28 6d 65 73 73 61 67  ;.    if (messag
1060: 65 53 74 72 2e 67 65 74 28 29 20 3d 3d 20 4e 55  eStr.get() == NU
1070: 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  LL) {.        re
1080: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
1090: 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 2b 3d 20  ..    result += 
10a0: 22 3a 20 22 3b 0a 0a 20 20 20 20 63 6f 6e 73 74  ": ";..    const
10b0: 20 63 68 61 72 2a 20 6d 65 73 73 61 67 65 43 68   char* messageCh
10c0: 61 72 73 20 3d 20 28 2a 65 6e 76 29 2d 3e 47 65  ars = (*env)->Ge
10d0: 74 53 74 72 69 6e 67 55 54 46 43 68 61 72 73 28  tStringUTFChars(
10e0: 65 2c 20 6d 65 73 73 61 67 65 53 74 72 2e 67 65  e, messageStr.ge
10f0: 74 28 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  t(), NULL);.    
1100: 69 66 20 28 6d 65 73 73 61 67 65 43 68 61 72 73  if (messageChars
1110: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
1120: 20 20 20 20 72 65 73 75 6c 74 20 2b 3d 20 6d 65      result += me
1130: 73 73 61 67 65 43 68 61 72 73 3b 0a 20 20 20 20  ssageChars;.    
1140: 20 20 20 20 28 2a 65 6e 76 29 2d 3e 52 65 6c 65      (*env)->Rele
1150: 61 73 65 53 74 72 69 6e 67 55 54 46 43 68 61 72  aseStringUTFChar
1160: 73 28 65 2c 20 6d 65 73 73 61 67 65 53 74 72 2e  s(e, messageStr.
1170: 67 65 74 28 29 2c 20 6d 65 73 73 61 67 65 43 68  get(), messageCh
1180: 61 72 73 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ars);.    } else
1190: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c   {.        resul
11a0: 74 20 2b 3d 20 22 3c 65 72 72 6f 72 20 67 65 74  t += "<error get
11b0: 74 69 6e 67 20 6d 65 73 73 61 67 65 3e 22 3b 0a  ting message>";.
11c0: 20 20 20 20 20 20 20 20 28 2a 65 6e 76 29 2d 3e          (*env)->
11d0: 45 78 63 65 70 74 69 6f 6e 43 6c 65 61 72 28 65  ExceptionClear(e
11e0: 29 3b 20 2f 2f 20 63 6c 65 61 72 20 4f 4f 4d 0a  ); // clear OOM.
11f0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
1200: 6e 20 74 72 75 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n true;.}../*. *
1210: 20 52 65 74 75 72 6e 73 20 61 6e 20 65 78 63 65   Returns an exce
1220: 70 74 69 6f 6e 20 28 77 69 74 68 20 73 74 61 63  ption (with stac
1230: 6b 20 74 72 61 63 65 29 20 61 73 20 61 20 73 74  k trace) as a st
1240: 72 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ring.. */.static
1250: 20 62 6f 6f 6c 20 67 65 74 53 74 61 63 6b 54 72   bool getStackTr
1260: 61 63 65 28 43 5f 4a 4e 49 45 6e 76 2a 20 65 6e  ace(C_JNIEnv* en
1270: 76 2c 20 6a 74 68 72 6f 77 61 62 6c 65 20 65 78  v, jthrowable ex
1280: 63 65 70 74 69 6f 6e 2c 20 73 74 64 3a 3a 73 74  ception, std::st
1290: 72 69 6e 67 26 20 72 65 73 75 6c 74 29 20 7b 0a  ring& result) {.
12a0: 20 20 20 20 4a 4e 49 45 6e 76 2a 20 65 20 3d 20      JNIEnv* e = 
12b0: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
12c0: 3c 4a 4e 49 45 6e 76 2a 3e 28 65 6e 76 29 3b 0a  <JNIEnv*>(env);.
12d0: 0a 20 20 20 20 73 63 6f 70 65 64 5f 6c 6f 63 61  .    scoped_loca
12e0: 6c 5f 72 65 66 3c 6a 63 6c 61 73 73 3e 20 73 74  l_ref<jclass> st
12f0: 72 69 6e 67 57 72 69 74 65 72 43 6c 61 73 73 28  ringWriterClass(
1300: 65 6e 76 2c 20 66 69 6e 64 43 6c 61 73 73 28 65  env, findClass(e
1310: 6e 76 2c 20 22 6a 61 76 61 2f 69 6f 2f 53 74 72  nv, "java/io/Str
1320: 69 6e 67 57 72 69 74 65 72 22 29 29 3b 0a 20 20  ingWriter"));.  
1330: 20 20 69 66 20 28 73 74 72 69 6e 67 57 72 69 74    if (stringWrit
1340: 65 72 43 6c 61 73 73 2e 67 65 74 28 29 20 3d 3d  erClass.get() ==
1350: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20   NULL) {.       
1360: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
1370: 20 20 20 7d 0a 0a 20 20 20 20 6a 6d 65 74 68 6f     }..    jmetho
1380: 64 49 44 20 73 74 72 69 6e 67 57 72 69 74 65 72  dID stringWriter
1390: 43 74 6f 72 20 3d 20 28 2a 65 6e 76 29 2d 3e 47  Ctor = (*env)->G
13a0: 65 74 4d 65 74 68 6f 64 49 44 28 65 2c 20 73 74  etMethodID(e, st
13b0: 72 69 6e 67 57 72 69 74 65 72 43 6c 61 73 73 2e  ringWriterClass.
13c0: 67 65 74 28 29 2c 20 22 3c 69 6e 69 74 3e 22 2c  get(), "<init>",
13d0: 20 22 28 29 56 22 29 3b 0a 20 20 20 20 6a 6d 65   "()V");.    jme
13e0: 74 68 6f 64 49 44 20 73 74 72 69 6e 67 57 72 69  thodID stringWri
13f0: 74 65 72 54 6f 53 74 72 69 6e 67 4d 65 74 68 6f  terToStringMetho
1400: 64 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d =.            
1410: 28 2a 65 6e 76 29 2d 3e 47 65 74 4d 65 74 68 6f  (*env)->GetMetho
1420: 64 49 44 28 65 2c 20 73 74 72 69 6e 67 57 72 69  dID(e, stringWri
1430: 74 65 72 43 6c 61 73 73 2e 67 65 74 28 29 2c 20  terClass.get(), 
1440: 22 74 6f 53 74 72 69 6e 67 22 2c 20 22 28 29 4c  "toString", "()L
1450: 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67  java/lang/String
1460: 3b 22 29 3b 0a 0a 20 20 20 20 73 63 6f 70 65 64  ;");..    scoped
1470: 5f 6c 6f 63 61 6c 5f 72 65 66 3c 6a 63 6c 61 73  _local_ref<jclas
1480: 73 3e 20 70 72 69 6e 74 57 72 69 74 65 72 43 6c  s> printWriterCl
1490: 61 73 73 28 65 6e 76 2c 20 66 69 6e 64 43 6c 61  ass(env, findCla
14a0: 73 73 28 65 6e 76 2c 20 22 6a 61 76 61 2f 69 6f  ss(env, "java/io
14b0: 2f 50 72 69 6e 74 57 72 69 74 65 72 22 29 29 3b  /PrintWriter"));
14c0: 0a 20 20 20 20 69 66 20 28 70 72 69 6e 74 57 72  .    if (printWr
14d0: 69 74 65 72 43 6c 61 73 73 2e 67 65 74 28 29 20  iterClass.get() 
14e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20  == NULL) {.     
14f0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
1500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 6d 65 74  .    }..    jmet
1510: 68 6f 64 49 44 20 70 72 69 6e 74 57 72 69 74 65  hodID printWrite
1520: 72 43 74 6f 72 20 3d 0a 20 20 20 20 20 20 20 20  rCtor =.        
1530: 20 20 20 20 28 2a 65 6e 76 29 2d 3e 47 65 74 4d      (*env)->GetM
1540: 65 74 68 6f 64 49 44 28 65 2c 20 70 72 69 6e 74  ethodID(e, print
1550: 57 72 69 74 65 72 43 6c 61 73 73 2e 67 65 74 28  WriterClass.get(
1560: 29 2c 20 22 3c 69 6e 69 74 3e 22 2c 20 22 28 4c  ), "<init>", "(L
1570: 6a 61 76 61 2f 69 6f 2f 57 72 69 74 65 72 3b 29  java/io/Writer;)
1580: 56 22 29 3b 0a 0a 20 20 20 20 73 63 6f 70 65 64  V");..    scoped
1590: 5f 6c 6f 63 61 6c 5f 72 65 66 3c 6a 6f 62 6a 65  _local_ref<jobje
15a0: 63 74 3e 20 73 74 72 69 6e 67 57 72 69 74 65 72  ct> stringWriter
15b0: 28 65 6e 76 2c 0a 20 20 20 20 20 20 20 20 20 20  (env,.          
15c0: 20 20 28 2a 65 6e 76 29 2d 3e 4e 65 77 4f 62 6a    (*env)->NewObj
15d0: 65 63 74 28 65 2c 20 73 74 72 69 6e 67 57 72 69  ect(e, stringWri
15e0: 74 65 72 43 6c 61 73 73 2e 67 65 74 28 29 2c 20  terClass.get(), 
15f0: 73 74 72 69 6e 67 57 72 69 74 65 72 43 74 6f 72  stringWriterCtor
1600: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 72 69  ));.    if (stri
1610: 6e 67 57 72 69 74 65 72 2e 67 65 74 28 29 20 3d  ngWriter.get() =
1620: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20  = NULL) {.      
1630: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
1640: 20 20 20 20 7d 0a 0a 20 20 20 20 6a 6f 62 6a 65      }..    jobje
1650: 63 74 20 70 72 69 6e 74 57 72 69 74 65 72 20 3d  ct printWriter =
1660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 2a 65  .            (*e
1670: 6e 76 29 2d 3e 4e 65 77 4f 62 6a 65 63 74 28 65  nv)->NewObject(e
1680: 2c 20 70 72 69 6e 74 57 72 69 74 65 72 43 6c 61  , printWriterCla
1690: 73 73 2e 67 65 74 28 29 2c 20 70 72 69 6e 74 57  ss.get(), printW
16a0: 72 69 74 65 72 43 74 6f 72 2c 20 73 74 72 69 6e  riterCtor, strin
16b0: 67 57 72 69 74 65 72 2e 67 65 74 28 29 29 3b 0a  gWriter.get());.
16c0: 20 20 20 20 69 66 20 28 70 72 69 6e 74 57 72 69      if (printWri
16d0: 74 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ter == NULL) {. 
16e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
16f0: 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  lse;.    }..    
1700: 73 63 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72 65 66  scoped_local_ref
1710: 3c 6a 63 6c 61 73 73 3e 20 65 78 63 65 70 74 69  <jclass> excepti
1720: 6f 6e 43 6c 61 73 73 28 65 6e 76 2c 20 28 2a 65  onClass(env, (*e
1730: 6e 76 29 2d 3e 47 65 74 4f 62 6a 65 63 74 43 6c  nv)->GetObjectCl
1740: 61 73 73 28 65 2c 20 65 78 63 65 70 74 69 6f 6e  ass(e, exception
1750: 29 29 3b 20 2f 2f 20 63 61 6e 27 74 20 66 61 69  )); // can't fai
1760: 6c 0a 20 20 20 20 6a 6d 65 74 68 6f 64 49 44 20  l.    jmethodID 
1770: 70 72 69 6e 74 53 74 61 63 6b 54 72 61 63 65 4d  printStackTraceM
1780: 65 74 68 6f 64 20 3d 0a 20 20 20 20 20 20 20 20  ethod =.        
1790: 20 20 20 20 28 2a 65 6e 76 29 2d 3e 47 65 74 4d      (*env)->GetM
17a0: 65 74 68 6f 64 49 44 28 65 2c 20 65 78 63 65 70  ethodID(e, excep
17b0: 74 69 6f 6e 43 6c 61 73 73 2e 67 65 74 28 29 2c  tionClass.get(),
17c0: 20 22 70 72 69 6e 74 53 74 61 63 6b 54 72 61 63   "printStackTrac
17d0: 65 22 2c 20 22 28 4c 6a 61 76 61 2f 69 6f 2f 50  e", "(Ljava/io/P
17e0: 72 69 6e 74 57 72 69 74 65 72 3b 29 56 22 29 3b  rintWriter;)V");
17f0: 0a 20 20 20 20 28 2a 65 6e 76 29 2d 3e 43 61 6c  .    (*env)->Cal
1800: 6c 56 6f 69 64 4d 65 74 68 6f 64 28 65 2c 20 65  lVoidMethod(e, e
1810: 78 63 65 70 74 69 6f 6e 2c 20 70 72 69 6e 74 53  xception, printS
1820: 74 61 63 6b 54 72 61 63 65 4d 65 74 68 6f 64 2c  tackTraceMethod,
1830: 20 70 72 69 6e 74 57 72 69 74 65 72 29 3b 0a 0a   printWriter);..
1840: 20 20 20 20 69 66 20 28 28 2a 65 6e 76 29 2d 3e      if ((*env)->
1850: 45 78 63 65 70 74 69 6f 6e 43 68 65 63 6b 28 65  ExceptionCheck(e
1860: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  )) {.        ret
1870: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
1880: 0a 0a 20 20 20 20 73 63 6f 70 65 64 5f 6c 6f 63  ..    scoped_loc
1890: 61 6c 5f 72 65 66 3c 6a 73 74 72 69 6e 67 3e 20  al_ref<jstring> 
18a0: 6d 65 73 73 61 67 65 53 74 72 28 65 6e 76 2c 0a  messageStr(env,.
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 6a 73 74              (jst
18c0: 72 69 6e 67 29 20 28 2a 65 6e 76 29 2d 3e 43 61  ring) (*env)->Ca
18d0: 6c 6c 4f 62 6a 65 63 74 4d 65 74 68 6f 64 28 65  llObjectMethod(e
18e0: 2c 20 73 74 72 69 6e 67 57 72 69 74 65 72 2e 67  , stringWriter.g
18f0: 65 74 28 29 2c 20 73 74 72 69 6e 67 57 72 69 74  et(), stringWrit
1900: 65 72 54 6f 53 74 72 69 6e 67 4d 65 74 68 6f 64  erToStringMethod
1910: 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 65 73 73  ));.    if (mess
1920: 61 67 65 53 74 72 2e 67 65 74 28 29 20 3d 3d 20  ageStr.get() == 
1930: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
1940: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
1950: 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63    }..    const c
1960: 68 61 72 2a 20 75 74 66 43 68 61 72 73 20 3d 20  har* utfChars = 
1970: 28 2a 65 6e 76 29 2d 3e 47 65 74 53 74 72 69 6e  (*env)->GetStrin
1980: 67 55 54 46 43 68 61 72 73 28 65 2c 20 6d 65 73  gUTFChars(e, mes
1990: 73 61 67 65 53 74 72 2e 67 65 74 28 29 2c 20 4e  sageStr.get(), N
19a0: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 75 74  ULL);.    if (ut
19b0: 66 43 68 61 72 73 20 3d 3d 20 4e 55 4c 4c 29 20  fChars == NULL) 
19c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
19d0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20   false;.    }.. 
19e0: 20 20 20 72 65 73 75 6c 74 20 3d 20 75 74 66 43     result = utfC
19f0: 68 61 72 73 3b 0a 0a 20 20 20 20 28 2a 65 6e 76  hars;..    (*env
1a00: 29 2d 3e 52 65 6c 65 61 73 65 53 74 72 69 6e 67  )->ReleaseString
1a10: 55 54 46 43 68 61 72 73 28 65 2c 20 6d 65 73 73  UTFChars(e, mess
1a20: 61 67 65 53 74 72 2e 67 65 74 28 29 2c 20 75 74  ageStr.get(), ut
1a30: 66 43 68 61 72 73 29 3b 0a 20 20 20 20 72 65 74  fChars);.    ret
1a40: 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 65 78 74  urn true;.}..ext
1a50: 65 72 6e 20 22 43 22 20 69 6e 74 20 6a 6e 69 54  ern "C" int jniT
1a60: 68 72 6f 77 45 78 63 65 70 74 69 6f 6e 28 43 5f  hrowException(C_
1a70: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 63 6f 6e  JNIEnv* env, con
1a80: 73 74 20 63 68 61 72 2a 20 63 6c 61 73 73 4e 61  st char* classNa
1a90: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  me, const char* 
1aa0: 6d 73 67 29 20 7b 0a 20 20 20 20 4a 4e 49 45 6e  msg) {.    JNIEn
1ab0: 76 2a 20 65 20 3d 20 72 65 69 6e 74 65 72 70 72  v* e = reinterpr
1ac0: 65 74 5f 63 61 73 74 3c 4a 4e 49 45 6e 76 2a 3e  et_cast<JNIEnv*>
1ad0: 28 65 6e 76 29 3b 0a 0a 20 20 20 20 69 66 20 28  (env);..    if (
1ae0: 28 2a 65 6e 76 29 2d 3e 45 78 63 65 70 74 69 6f  (*env)->Exceptio
1af0: 6e 43 68 65 63 6b 28 65 29 29 20 7b 0a 20 20 20  nCheck(e)) {.   
1b00: 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 63 6f       /* TODO: co
1b10: 6e 73 69 64 65 72 20 63 72 65 61 74 69 6e 67 20  nsider creating 
1b20: 74 68 65 20 6e 65 77 20 65 78 63 65 70 74 69 6f  the new exceptio
1b30: 6e 20 77 69 74 68 20 74 68 69 73 20 61 73 20 22  n with this as "
1b40: 63 61 75 73 65 22 20 2a 2f 0a 20 20 20 20 20 20  cause" */.      
1b50: 20 20 73 63 6f 70 65 64 5f 6c 6f 63 61 6c 5f 72    scoped_local_r
1b60: 65 66 3c 6a 74 68 72 6f 77 61 62 6c 65 3e 20 65  ef<jthrowable> e
1b70: 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 28 2a  xception(env, (*
1b80: 65 6e 76 29 2d 3e 45 78 63 65 70 74 69 6f 6e 4f  env)->ExceptionO
1b90: 63 63 75 72 72 65 64 28 65 29 29 3b 0a 20 20 20  ccurred(e));.   
1ba0: 20 20 20 20 20 28 2a 65 6e 76 29 2d 3e 45 78 63       (*env)->Exc
1bb0: 65 70 74 69 6f 6e 43 6c 65 61 72 28 65 29 3b 0a  eptionClear(e);.
1bc0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 78 63  .        if (exc
1bd0: 65 70 74 69 6f 6e 2e 67 65 74 28 29 20 21 3d 20  eption.get() != 
1be0: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
1bf0: 20 20 20 20 73 74 64 3a 3a 73 74 72 69 6e 67 20      std::string 
1c00: 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
1c10: 20 20 67 65 74 45 78 63 65 70 74 69 6f 6e 53 75    getExceptionSu
1c20: 6d 6d 61 72 79 28 65 6e 76 2c 20 65 78 63 65 70  mmary(env, excep
1c30: 74 69 6f 6e 2e 67 65 74 28 29 2c 20 74 65 78 74  tion.get(), text
1c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  );.            A
1c50: 4c 4f 47 57 28 22 44 69 73 63 61 72 64 69 6e 67  LOGW("Discarding
1c60: 20 70 65 6e 64 69 6e 67 20 65 78 63 65 70 74 69   pending excepti
1c70: 6f 6e 20 28 25 73 29 20 74 6f 20 74 68 72 6f 77  on (%s) to throw
1c80: 20 25 73 22 2c 20 74 65 78 74 2e 63 5f 73 74 72   %s", text.c_str
1c90: 28 29 2c 20 63 6c 61 73 73 4e 61 6d 65 29 3b 0a  (), className);.
1ca0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
1cb0: 0a 20 20 20 20 73 63 6f 70 65 64 5f 6c 6f 63 61  .    scoped_loca
1cc0: 6c 5f 72 65 66 3c 6a 63 6c 61 73 73 3e 20 65 78  l_ref<jclass> ex
1cd0: 63 65 70 74 69 6f 6e 43 6c 61 73 73 28 65 6e 76  ceptionClass(env
1ce0: 2c 20 66 69 6e 64 43 6c 61 73 73 28 65 6e 76 2c  , findClass(env,
1cf0: 20 63 6c 61 73 73 4e 61 6d 65 29 29 3b 0a 20 20   className));.  
1d00: 20 20 69 66 20 28 65 78 63 65 70 74 69 6f 6e 43    if (exceptionC
1d10: 6c 61 73 73 2e 67 65 74 28 29 20 3d 3d 20 4e 55  lass.get() == NU
1d20: 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 41 4c  LL) {.        AL
1d30: 4f 47 45 28 22 55 6e 61 62 6c 65 20 74 6f 20 66  OGE("Unable to f
1d40: 69 6e 64 20 65 78 63 65 70 74 69 6f 6e 20 63 6c  ind exception cl
1d50: 61 73 73 20 25 73 22 2c 20 63 6c 61 73 73 4e 61  ass %s", classNa
1d60: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  me);.        /* 
1d70: 43 6c 61 73 73 4e 6f 74 46 6f 75 6e 64 45 78 63  ClassNotFoundExc
1d80: 65 70 74 69 6f 6e 20 6e 6f 77 20 70 65 6e 64 69  eption now pendi
1d90: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ng */.        re
1da0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1db0: 20 20 20 20 69 66 20 28 28 2a 65 6e 76 29 2d 3e      if ((*env)->
1dc0: 54 68 72 6f 77 4e 65 77 28 65 2c 20 65 78 63 65  ThrowNew(e, exce
1dd0: 70 74 69 6f 6e 43 6c 61 73 73 2e 67 65 74 28 29  ptionClass.get()
1de0: 2c 20 6d 73 67 29 20 21 3d 20 4a 4e 49 5f 4f 4b  , msg) != JNI_OK
1df0: 29 20 7b 0a 20 20 20 20 20 20 20 20 41 4c 4f 47  ) {.        ALOG
1e00: 45 28 22 46 61 69 6c 65 64 20 74 68 72 6f 77 69  E("Failed throwi
1e10: 6e 67 20 27 25 73 27 20 27 25 73 27 22 2c 20 63  ng '%s' '%s'", c
1e20: 6c 61 73 73 4e 61 6d 65 2c 20 6d 73 67 29 3b 0a  lassName, msg);.
1e30: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 20 65 78          /* an ex
1e40: 63 65 70 74 69 6f 6e 2c 20 6d 6f 73 74 20 6c 69  ception, most li
1e50: 6b 65 6c 79 20 4f 4f 4d 2c 20 77 69 6c 6c 20 6e  kely OOM, will n
1e60: 6f 77 20 62 65 20 70 65 6e 64 69 6e 67 20 2a 2f  ow be pending */
1e70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e80: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  -1;.    }..    r
1e90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20  eturn 0;.}..int 
1ea0: 6a 6e 69 54 68 72 6f 77 45 78 63 65 70 74 69 6f  jniThrowExceptio
1eb0: 6e 46 6d 74 28 43 5f 4a 4e 49 45 6e 76 2a 20 65  nFmt(C_JNIEnv* e
1ec0: 6e 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  nv, const char* 
1ed0: 63 6c 61 73 73 4e 61 6d 65 2c 20 63 6f 6e 73 74  className, const
1ee0: 20 63 68 61 72 2a 20 66 6d 74 2c 20 76 61 5f 6c   char* fmt, va_l
1ef0: 69 73 74 20 61 72 67 73 29 20 7b 0a 20 20 20 20  ist args) {.    
1f00: 63 68 61 72 20 6d 73 67 42 75 66 5b 35 31 32 5d  char msgBuf[512]
1f10: 3b 0a 20 20 20 20 76 73 6e 70 72 69 6e 74 66 28  ;.    vsnprintf(
1f20: 6d 73 67 42 75 66 2c 20 73 69 7a 65 6f 66 28 6d  msgBuf, sizeof(m
1f30: 73 67 42 75 66 29 2c 20 66 6d 74 2c 20 61 72 67  sgBuf), fmt, arg
1f40: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a  s);.    return j
1f50: 6e 69 54 68 72 6f 77 45 78 63 65 70 74 69 6f 6e  niThrowException
1f60: 28 65 6e 76 2c 20 63 6c 61 73 73 4e 61 6d 65 2c  (env, className,
1f70: 20 6d 73 67 42 75 66 29 3b 0a 7d 0a 0a 69 6e 74   msgBuf);.}..int
1f80: 20 6a 6e 69 54 68 72 6f 77 4e 75 6c 6c 50 6f 69   jniThrowNullPoi
1f90: 6e 74 65 72 45 78 63 65 70 74 69 6f 6e 28 43 5f  nterException(C_
1fa0: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 63 6f 6e  JNIEnv* env, con
1fb0: 73 74 20 63 68 61 72 2a 20 6d 73 67 29 20 7b 0a  st char* msg) {.
1fc0: 20 20 20 20 72 65 74 75 72 6e 20 6a 6e 69 54 68      return jniTh
1fd0: 72 6f 77 45 78 63 65 70 74 69 6f 6e 28 65 6e 76  rowException(env
1fe0: 2c 20 22 6a 61 76 61 2f 6c 61 6e 67 2f 4e 75 6c  , "java/lang/Nul
1ff0: 6c 50 6f 69 6e 74 65 72 45 78 63 65 70 74 69 6f  lPointerExceptio
2000: 6e 22 2c 20 6d 73 67 29 3b 0a 7d 0a 0a 69 6e 74  n", msg);.}..int
2010: 20 6a 6e 69 54 68 72 6f 77 52 75 6e 74 69 6d 65   jniThrowRuntime
2020: 45 78 63 65 70 74 69 6f 6e 28 43 5f 4a 4e 49 45  Exception(C_JNIE
2030: 6e 76 2a 20 65 6e 76 2c 20 63 6f 6e 73 74 20 63  nv* env, const c
2040: 68 61 72 2a 20 6d 73 67 29 20 7b 0a 20 20 20 20  har* msg) {.    
2050: 72 65 74 75 72 6e 20 6a 6e 69 54 68 72 6f 77 45  return jniThrowE
2060: 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 22 6a  xception(env, "j
2070: 61 76 61 2f 6c 61 6e 67 2f 52 75 6e 74 69 6d 65  ava/lang/Runtime
2080: 45 78 63 65 70 74 69 6f 6e 22 2c 20 6d 73 67 29  Exception", msg)
2090: 3b 0a 7d 0a 0a 69 6e 74 20 6a 6e 69 54 68 72 6f  ;.}..int jniThro
20a0: 77 49 4f 45 78 63 65 70 74 69 6f 6e 28 43 5f 4a  wIOException(C_J
20b0: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 69 6e 74 20  NIEnv* env, int 
20c0: 65 72 72 6e 75 6d 29 20 7b 0a 20 20 20 20 63 68  errnum) {.    ch
20d0: 61 72 20 62 75 66 66 65 72 5b 38 30 5d 3b 0a 20  ar buffer[80];. 
20e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 6d     const char* m
20f0: 65 73 73 61 67 65 20 3d 20 6a 6e 69 53 74 72 45  essage = jniStrE
2100: 72 72 6f 72 28 65 72 72 6e 75 6d 2c 20 62 75 66  rror(errnum, buf
2110: 66 65 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66  fer, sizeof(buff
2120: 65 72 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er));.    return
2130: 20 6a 6e 69 54 68 72 6f 77 45 78 63 65 70 74 69   jniThrowExcepti
2140: 6f 6e 28 65 6e 76 2c 20 22 6a 61 76 61 2f 69 6f  on(env, "java/io
2150: 2f 49 4f 45 78 63 65 70 74 69 6f 6e 22 2c 20 6d  /IOException", m
2160: 65 73 73 61 67 65 29 3b 0a 7d 0a 0a 73 74 61 74  essage);.}..stat
2170: 69 63 20 73 74 64 3a 3a 73 74 72 69 6e 67 20 6a  ic std::string j
2180: 6e 69 47 65 74 53 74 61 63 6b 54 72 61 63 65 28  niGetStackTrace(
2190: 43 5f 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a  C_JNIEnv* env, j
21a0: 74 68 72 6f 77 61 62 6c 65 20 65 78 63 65 70 74  throwable except
21b0: 69 6f 6e 29 20 7b 0a 20 20 20 20 4a 4e 49 45 6e  ion) {.    JNIEn
21c0: 76 2a 20 65 20 3d 20 72 65 69 6e 74 65 72 70 72  v* e = reinterpr
21d0: 65 74 5f 63 61 73 74 3c 4a 4e 49 45 6e 76 2a 3e  et_cast<JNIEnv*>
21e0: 28 65 6e 76 29 3b 0a 0a 20 20 20 20 73 63 6f 70  (env);..    scop
21f0: 65 64 5f 6c 6f 63 61 6c 5f 72 65 66 3c 6a 74 68  ed_local_ref<jth
2200: 72 6f 77 61 62 6c 65 3e 20 63 75 72 72 65 6e 74  rowable> current
2210: 45 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 28  Exception(env, (
2220: 2a 65 6e 76 29 2d 3e 45 78 63 65 70 74 69 6f 6e  *env)->Exception
2230: 4f 63 63 75 72 72 65 64 28 65 29 29 3b 0a 20 20  Occurred(e));.  
2240: 20 20 69 66 20 28 65 78 63 65 70 74 69 6f 6e 20    if (exception 
2250: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20  == NULL) {.     
2260: 20 20 20 65 78 63 65 70 74 69 6f 6e 20 3d 20 63     exception = c
2270: 75 72 72 65 6e 74 45 78 63 65 70 74 69 6f 6e 2e  urrentException.
2280: 67 65 74 28 29 3b 0a 20 20 20 20 20 20 20 20 69  get();.        i
2290: 66 20 28 65 78 63 65 70 74 69 6f 6e 20 3d 3d 20  f (exception == 
22a0: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
22b0: 20 20 72 65 74 75 72 6e 20 22 3c 6e 6f 20 70 65    return "<no pe
22c0: 6e 64 69 6e 67 20 65 78 63 65 70 74 69 6f 6e 3e  nding exception>
22d0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
22e0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 75 72 72   }..    if (curr
22f0: 65 6e 74 45 78 63 65 70 74 69 6f 6e 2e 67 65 74  entException.get
2300: 28 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  () != NULL) {.  
2310: 20 20 20 20 20 20 28 2a 65 6e 76 29 2d 3e 45 78        (*env)->Ex
2320: 63 65 70 74 69 6f 6e 43 6c 65 61 72 28 65 29 3b  ceptionClear(e);
2330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 64 3a  .    }..    std:
2340: 3a 73 74 72 69 6e 67 20 74 72 61 63 65 3b 0a 20  :string trace;. 
2350: 20 20 20 69 66 20 28 21 67 65 74 53 74 61 63 6b     if (!getStack
2360: 54 72 61 63 65 28 65 6e 76 2c 20 65 78 63 65 70  Trace(env, excep
2370: 74 69 6f 6e 2c 20 74 72 61 63 65 29 29 20 7b 0a  tion, trace)) {.
2380: 20 20 20 20 20 20 20 20 28 2a 65 6e 76 29 2d 3e          (*env)->
2390: 45 78 63 65 70 74 69 6f 6e 43 6c 65 61 72 28 65  ExceptionClear(e
23a0: 29 3b 0a 20 20 20 20 20 20 20 20 67 65 74 45 78  );.        getEx
23b0: 63 65 70 74 69 6f 6e 53 75 6d 6d 61 72 79 28 65  ceptionSummary(e
23c0: 6e 76 2c 20 65 78 63 65 70 74 69 6f 6e 2c 20 74  nv, exception, t
23d0: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  race);.    }..  
23e0: 20 20 69 66 20 28 63 75 72 72 65 6e 74 45 78 63    if (currentExc
23f0: 65 70 74 69 6f 6e 2e 67 65 74 28 29 20 21 3d 20  eption.get() != 
2400: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  NULL) {.        
2410: 28 2a 65 6e 76 29 2d 3e 54 68 72 6f 77 28 65 2c  (*env)->Throw(e,
2420: 20 63 75 72 72 65 6e 74 45 78 63 65 70 74 69 6f   currentExceptio
2430: 6e 2e 67 65 74 28 29 29 3b 20 2f 2f 20 72 65 74  n.get()); // ret
2440: 68 72 6f 77 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hrow.    }..    
2450: 72 65 74 75 72 6e 20 74 72 61 63 65 3b 0a 7d 0a  return trace;.}.
2460: 0a 76 6f 69 64 20 6a 6e 69 4c 6f 67 45 78 63 65  .void jniLogExce
2470: 70 74 69 6f 6e 28 43 5f 4a 4e 49 45 6e 76 2a 20  ption(C_JNIEnv* 
2480: 65 6e 76 2c 20 69 6e 74 20 70 72 69 6f 72 69 74  env, int priorit
2490: 79 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 74  y, const char* t
24a0: 61 67 2c 20 6a 74 68 72 6f 77 61 62 6c 65 20 65  ag, jthrowable e
24b0: 78 63 65 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20  xception) {.    
24c0: 73 74 64 3a 3a 73 74 72 69 6e 67 20 74 72 61 63  std::string trac
24d0: 65 28 6a 6e 69 47 65 74 53 74 61 63 6b 54 72 61  e(jniGetStackTra
24e0: 63 65 28 65 6e 76 2c 20 65 78 63 65 70 74 69 6f  ce(env, exceptio
24f0: 6e 29 29 3b 0a 20 20 20 20 5f 5f 61 6e 64 72 6f  n));.    __andro
2500: 69 64 5f 6c 6f 67 5f 77 72 69 74 65 28 70 72 69  id_log_write(pri
2510: 6f 72 69 74 79 2c 20 74 61 67 2c 20 74 72 61 63  ority, tag, trac
2520: 65 2e 63 5f 73 74 72 28 29 29 3b 0a 7d 0a 0a 63  e.c_str());.}..c
2530: 6f 6e 73 74 20 63 68 61 72 2a 20 6a 6e 69 53 74  onst char* jniSt
2540: 72 45 72 72 6f 72 28 69 6e 74 20 65 72 72 6e 75  rError(int errnu
2550: 6d 2c 20 63 68 61 72 2a 20 62 75 66 2c 20 73 69  m, char* buf, si
2560: 7a 65 5f 74 20 62 75 66 6c 65 6e 29 20 7b 0a 23  ze_t buflen) {.#
2570: 69 66 20 5f 5f 47 4c 49 42 43 5f 5f 0a 20 20 20  if __GLIBC__.   
2580: 20 2f 2f 20 4e 6f 74 65 3a 20 67 6c 69 62 63 20   // Note: glibc 
2590: 68 61 73 20 61 20 6e 6f 6e 73 74 61 6e 64 61 72  has a nonstandar
25a0: 64 20 73 74 72 65 72 72 6f 72 5f 72 20 74 68 61  d strerror_r tha
25b0: 74 20 72 65 74 75 72 6e 73 20 63 68 61 72 2a 20  t returns char* 
25c0: 72 61 74 68 65 72 20 74 68 61 6e 20 50 4f 53 49  rather than POSI
25d0: 58 27 73 20 69 6e 74 2e 0a 20 20 20 20 2f 2f 20  X's int..    // 
25e0: 63 68 61 72 20 2a 73 74 72 65 72 72 6f 72 5f 72  char *strerror_r
25f0: 28 69 6e 74 20 65 72 72 6e 75 6d 2c 20 63 68 61  (int errnum, cha
2600: 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6e  r *buf, size_t n
2610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74  );.    return st
2620: 72 65 72 72 6f 72 5f 72 28 65 72 72 6e 75 6d 2c  rerror_r(errnum,
2630: 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 23   buf, buflen);.#
2640: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 72 63 20  else.    int rc 
2650: 3d 20 73 74 72 65 72 72 6f 72 5f 72 28 65 72 72  = strerror_r(err
2660: 6e 75 6d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  num, buf, buflen
2670: 29 3b 0a 20 20 20 20 69 66 20 28 72 63 20 21 3d  );.    if (rc !=
2680: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f   0) {.        //
2690: 20 28 50 4f 53 49 58 20 6f 6e 6c 79 20 67 75 61   (POSIX only gua
26a0: 72 61 6e 74 65 65 73 20 61 20 76 61 6c 75 65 20  rantees a value 
26b0: 6f 74 68 65 72 20 74 68 61 6e 20 30 2e 20 54 68  other than 0. Th
26c0: 65 20 73 61 66 65 73 74 0a 20 20 20 20 20 20 20  e safest.       
26d0: 20 2f 2f 20 77 61 79 20 74 6f 20 69 6d 70 6c 65   // way to imple
26e0: 6d 65 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  ment this functi
26f0: 6f 6e 20 69 73 20 74 6f 20 75 73 65 20 43 2b 2b  on is to use C++
2700: 20 61 6e 64 20 6f 76 65 72 6c 6f 61 64 20 6f 6e   and overload on
2710: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2f 2f 20   the.        // 
2720: 74 79 70 65 20 6f 66 20 73 74 72 65 72 72 6f 72  type of strerror
2730: 5f 72 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  _r to accurately
2740: 20 64 69 73 74 69 6e 67 75 69 73 68 20 47 4e 55   distinguish GNU
2750: 20 66 72 6f 6d 20 50 4f 53 49 58 2e 29 0a 20 20   from POSIX.).  
2760: 20 20 20 20 20 20 73 6e 70 72 69 6e 74 66 28 62        snprintf(b
2770: 75 66 2c 20 62 75 66 6c 65 6e 2c 20 22 65 72 72  uf, buflen, "err
2780: 6e 6f 20 25 64 22 2c 20 65 72 72 6e 75 6d 29 3b  no %d", errnum);
2790: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
27a0: 6e 20 62 75 66 3b 0a 23 65 6e 64 69 66 0a 7d 0a  n buf;.#endif.}.
27b0: 0a 6a 6f 62 6a 65 63 74 20 6a 6e 69 43 72 65 61  .jobject jniCrea
27c0: 74 65 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72  teFileDescriptor
27d0: 28 43 5f 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20  (C_JNIEnv* env, 
27e0: 69 6e 74 20 66 64 29 20 7b 0a 20 20 20 20 4a 4e  int fd) {.    JN
27f0: 49 45 6e 76 2a 20 65 20 3d 20 72 65 69 6e 74 65  IEnv* e = reinte
2800: 72 70 72 65 74 5f 63 61 73 74 3c 4a 4e 49 45 6e  rpret_cast<JNIEn
2810: 76 2a 3e 28 65 6e 76 29 3b 0a 20 20 20 20 73 74  v*>(env);.    st
2820: 61 74 69 63 20 6a 6d 65 74 68 6f 64 49 44 20 63  atic jmethodID c
2830: 74 6f 72 20 3d 20 65 2d 3e 47 65 74 4d 65 74 68  tor = e->GetMeth
2840: 6f 64 49 44 28 4a 6e 69 43 6f 6e 73 74 61 6e 74  odID(JniConstant
2850: 73 3a 3a 66 69 6c 65 44 65 73 63 72 69 70 74 6f  s::fileDescripto
2860: 72 43 6c 61 73 73 2c 20 22 3c 69 6e 69 74 3e 22  rClass, "<init>"
2870: 2c 20 22 28 29 56 22 29 3b 0a 20 20 20 20 6a 6f  , "()V");.    jo
2880: 62 6a 65 63 74 20 66 69 6c 65 44 65 73 63 72 69  bject fileDescri
2890: 70 74 6f 72 20 3d 20 28 2a 65 6e 76 29 2d 3e 4e  ptor = (*env)->N
28a0: 65 77 4f 62 6a 65 63 74 28 65 2c 20 4a 6e 69 43  ewObject(e, JniC
28b0: 6f 6e 73 74 61 6e 74 73 3a 3a 66 69 6c 65 44 65  onstants::fileDe
28c0: 73 63 72 69 70 74 6f 72 43 6c 61 73 73 2c 20 63  scriptorClass, c
28d0: 74 6f 72 29 3b 0a 20 20 20 20 2f 2f 20 4e 4f 54  tor);.    // NOT
28e0: 45 3a 20 4e 65 77 4f 62 6a 65 63 74 20 65 6e 73  E: NewObject ens
28f0: 75 72 65 73 20 74 68 61 74 20 61 6e 20 4f 75 74  ures that an Out
2900: 4f 66 4d 65 6d 6f 72 79 45 72 72 6f 72 20 77 69  OfMemoryError wi
2910: 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 74 68  ll be seen by th
2920: 65 20 4a 61 76 61 0a 20 20 20 20 2f 2f 20 63 61  e Java.    // ca
2930: 6c 6c 65 72 20 69 66 20 74 68 65 20 61 6c 6c 6f  ller if the allo
2940: 63 20 66 61 69 6c 73 2c 20 73 6f 20 77 65 20 6a  c fails, so we j
2950: 75 73 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ust return NULL 
2960: 77 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e  when that happen
2970: 73 2e 0a 20 20 20 20 69 66 20 28 66 69 6c 65 44  s..    if (fileD
2980: 65 73 63 72 69 70 74 6f 72 20 21 3d 20 4e 55 4c  escriptor != NUL
2990: 4c 29 20 20 7b 0a 20 20 20 20 20 20 20 20 6a 6e  L)  {.        jn
29a0: 69 53 65 74 46 69 6c 65 44 65 73 63 72 69 70 74  iSetFileDescript
29b0: 6f 72 4f 66 46 44 28 65 6e 76 2c 20 66 69 6c 65  orOfFD(env, file
29c0: 44 65 73 63 72 69 70 74 6f 72 2c 20 66 64 29 3b  Descriptor, fd);
29d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
29e0: 6e 20 66 69 6c 65 44 65 73 63 72 69 70 74 6f 72  n fileDescriptor
29f0: 3b 0a 7d 0a 0a 69 6e 74 20 6a 6e 69 47 65 74 46  ;.}..int jniGetF
2a00: 44 46 72 6f 6d 46 69 6c 65 44 65 73 63 72 69 70  DFromFileDescrip
2a10: 74 6f 72 28 43 5f 4a 4e 49 45 6e 76 2a 20 65 6e  tor(C_JNIEnv* en
2a20: 76 2c 20 6a 6f 62 6a 65 63 74 20 66 69 6c 65 44  v, jobject fileD
2a30: 65 73 63 72 69 70 74 6f 72 29 20 7b 0a 20 20 20  escriptor) {.   
2a40: 20 4a 4e 49 45 6e 76 2a 20 65 20 3d 20 72 65 69   JNIEnv* e = rei
2a50: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 4a 4e  nterpret_cast<JN
2a60: 49 45 6e 76 2a 3e 28 65 6e 76 29 3b 0a 20 20 20  IEnv*>(env);.   
2a70: 20 73 74 61 74 69 63 20 6a 66 69 65 6c 64 49 44   static jfieldID
2a80: 20 66 69 64 20 3d 20 65 2d 3e 47 65 74 46 69 65   fid = e->GetFie
2a90: 6c 64 49 44 28 4a 6e 69 43 6f 6e 73 74 61 6e 74  ldID(JniConstant
2aa0: 73 3a 3a 66 69 6c 65 44 65 73 63 72 69 70 74 6f  s::fileDescripto
2ab0: 72 43 6c 61 73 73 2c 20 22 64 65 73 63 72 69 70  rClass, "descrip
2ac0: 74 6f 72 22 2c 20 22 49 22 29 3b 0a 20 20 20 20  tor", "I");.    
2ad0: 69 66 20 28 66 69 6c 65 44 65 73 63 72 69 70 74  if (fileDescript
2ae0: 6f 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20  or != NULL) {.  
2af0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 2a 65        return (*e
2b00: 6e 76 29 2d 3e 47 65 74 49 6e 74 46 69 65 6c 64  nv)->GetIntField
2b10: 28 65 2c 20 66 69 6c 65 44 65 73 63 72 69 70 74  (e, fileDescript
2b20: 6f 72 2c 20 66 69 64 29 3b 0a 20 20 20 20 7d 20  or, fid);.    } 
2b30: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 72  else {.        r
2b40: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
2b50: 7d 0a 0a 76 6f 69 64 20 6a 6e 69 53 65 74 46 69  }..void jniSetFi
2b60: 6c 65 44 65 73 63 72 69 70 74 6f 72 4f 66 46 44  leDescriptorOfFD
2b70: 28 43 5f 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20  (C_JNIEnv* env, 
2b80: 6a 6f 62 6a 65 63 74 20 66 69 6c 65 44 65 73 63  jobject fileDesc
2b90: 72 69 70 74 6f 72 2c 20 69 6e 74 20 76 61 6c 75  riptor, int valu
2ba0: 65 29 20 7b 0a 20 20 20 20 4a 4e 49 45 6e 76 2a  e) {.    JNIEnv*
2bb0: 20 65 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74   e = reinterpret
2bc0: 5f 63 61 73 74 3c 4a 4e 49 45 6e 76 2a 3e 28 65  _cast<JNIEnv*>(e
2bd0: 6e 76 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20  nv);.    static 
2be0: 6a 66 69 65 6c 64 49 44 20 66 69 64 20 3d 20 65  jfieldID fid = e
2bf0: 2d 3e 47 65 74 46 69 65 6c 64 49 44 28 4a 6e 69  ->GetFieldID(Jni
2c00: 43 6f 6e 73 74 61 6e 74 73 3a 3a 66 69 6c 65 44  Constants::fileD
2c10: 65 73 63 72 69 70 74 6f 72 43 6c 61 73 73 2c 20  escriptorClass, 
2c20: 22 64 65 73 63 72 69 70 74 6f 72 22 2c 20 22 49  "descriptor", "I
2c30: 22 29 3b 0a 20 20 20 20 28 2a 65 6e 76 29 2d 3e  ");.    (*env)->
2c40: 53 65 74 49 6e 74 46 69 65 6c 64 28 65 2c 20 66  SetIntField(e, f
2c50: 69 6c 65 44 65 73 63 72 69 70 74 6f 72 2c 20 66  ileDescriptor, f
2c60: 69 64 2c 20 76 61 6c 75 65 29 3b 0a 7d 0a 0a 6a  id, value);.}..j
2c70: 6f 62 6a 65 63 74 20 6a 6e 69 47 65 74 52 65 66  object jniGetRef
2c80: 65 72 65 6e 74 28 43 5f 4a 4e 49 45 6e 76 2a 20  erent(C_JNIEnv* 
2c90: 65 6e 76 2c 20 6a 6f 62 6a 65 63 74 20 72 65 66  env, jobject ref
2ca0: 29 20 7b 0a 20 20 20 20 4a 4e 49 45 6e 76 2a 20  ) {.    JNIEnv* 
2cb0: 65 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f  e = reinterpret_
2cc0: 63 61 73 74 3c 4a 4e 49 45 6e 76 2a 3e 28 65 6e  cast<JNIEnv*>(en
2cd0: 76 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 6a  v);.    static j
2ce0: 6d 65 74 68 6f 64 49 44 20 67 65 74 20 3d 20 65  methodID get = e
2cf0: 2d 3e 47 65 74 4d 65 74 68 6f 64 49 44 28 4a 6e  ->GetMethodID(Jn
2d00: 69 43 6f 6e 73 74 61 6e 74 73 3a 3a 72 65 66 65  iConstants::refe
2d10: 72 65 6e 63 65 43 6c 61 73 73 2c 20 22 67 65 74  renceClass, "get
2d20: 22 2c 20 22 28 29 4c 6a 61 76 61 2f 6c 61 6e 67  ", "()Ljava/lang
2d30: 2f 4f 62 6a 65 63 74 3b 22 29 3b 0a 20 20 20 20  /Object;");.    
2d40: 72 65 74 75 72 6e 20 28 2a 65 6e 76 29 2d 3e 43  return (*env)->C
2d50: 61 6c 6c 4f 62 6a 65 63 74 4d 65 74 68 6f 64 28  allObjectMethod(
2d60: 65 2c 20 72 65 66 2c 20 67 65 74 29 3b 0a 7d 0a  e, ref, get);.}.
2d70: 0a                                               .