/*---------------------------------------------------------------------------*/ /* android_jni.cpp */ /* copyright (c) innovaphone 2012 */ /* */ /*---------------------------------------------------------------------------*/ #define ANDROID_JNI_CPP_ #include "platform/platform.h" #include #include "android_jni.h" #define FILE_ "android_jni.cpp" USING_NAMESPACE; /*----------------------------------------------------------------------------*/ typedef struct find_class_map { int min_version; jclass *p_class; const char *name; } find_class_map; #define FIND_CLASS_MAP(min_version,path,clazz) { min_version, &clazz##_Class, path#clazz } static find_class_map find_class_map_table[] = { FIND_CLASS_MAP( 1, "java/lang/", Integer), FIND_CLASS_MAP( 1, "java/lang/", Boolean), FIND_CLASS_MAP( 1, "android/os/", Build), { 1, &BuildVERSION_Class, "android/os/Build$VERSION" }, FIND_CLASS_MAP( 1, "android/content/", Context), FIND_CLASS_MAP( 1, "android/media/", AudioManager), FIND_CLASS_MAP(12, "android/net/rtp/", AudioGroup), FIND_CLASS_MAP( 1, "java/net/", InetAddress), FIND_CLASS_MAP(12, "android/net/rtp/", AudioStream), FIND_CLASS_MAP(12, "android/net/rtp/", RtpStream), FIND_CLASS_MAP(12, "android/net/rtp/", AudioCodec), FIND_CLASS_MAP( 1, "android/media/", RingtoneManager), FIND_CLASS_MAP( 1, "android/media/", Ringtone), FIND_CLASS_MAP( 1, "android/media/", ToneGenerator), FIND_CLASS_MAP( 1, "android/net/wifi/", WifiManager), { 1, &WifiManager_WifiLock_Class, "android/net/wifi/WifiManager$WifiLock" }, { 4, &WifiManager_MulticastLock_Class, "android/net/wifi/WifiManager$MulticastLock" }, FIND_CLASS_MAP( 1, "android/net/wifi/", WifiInfo), FIND_CLASS_MAP( 1, "android/net/", DhcpInfo), FIND_CLASS_MAP( 1, "java/io/", File), { 1, &Settings_System_Class, "android/provider/Settings$System" }, FIND_CLASS_MAP( 1, "android/os/", PowerManager), { 1, &PowerManager_WakeLock_Class, "android/os/PowerManager$WakeLock" }, FIND_CLASS_MAP( 3, "android/media/", AudioTrack), FIND_CLASS_MAP( 3, "android/media/", AudioFormat), FIND_CLASS_MAP( 3, "android/media/", AudioRecord), { 1, &MediaRecorder_AudioSource_Class, "android/media/MediaRecorder$AudioSource" }, FIND_CLASS_MAP( 9, "android/media/audiofx/", AudioEffect), FIND_CLASS_MAP(16, "android/media/audiofx/", AutomaticGainControl), FIND_CLASS_MAP(16, "android/media/audiofx/", AcousticEchoCanceler), FIND_CLASS_MAP(16, "android/media/audiofx/", NoiseSuppressor), FIND_CLASS_MAP( 1, "android/os/", Handler), FIND_CLASS_MAP( 1, "android/net/", Uri), FIND_CLASS_MAP( 1, "java/util/", Locale), FIND_CLASS_MAP( 1, "android/os/", SystemClock), FIND_CLASS_MAP( 1, "android/os/", Environment), FIND_CLASS_MAP( 1, "java/util/", UUID), FIND_CLASS_MAP( 8, "android/graphics/", ImageFormat), { 16, &MediaCodecInfo_CodecCapabilities_Class, "android/media/MediaCodecInfo$CodecCapabilities" }, FIND_CLASS_MAP( 1, "android/net/", ConnectivityManager), FIND_CLASS_MAP( 1, "android/net/", NetworkInfo), FIND_CLASS_MAP(21, "android/net/", Network), FIND_CLASS_MAP(21, "android/net/", LinkProperties), FIND_CLASS_MAP( 1, "java/util/", List), FIND_CLASS_MAP( 1, "java/util/", Enumeration), FIND_CLASS_MAP( 1, "java/lang/", Object), FIND_CLASS_MAP(21, "android/media/", AudioAttributes), { 21, &AudioAttributes_Builder_Class, "android/media/AudioAttributes$Builder" }, FIND_CLASS_MAP(26, "android/media/", AudioFocusRequest), { 26, &AudioFocusRequest_Builder_Class, "android/media/AudioFocusRequest$Builder" }, FIND_CLASS_MAP( 1, "android/os/", Bundle), FIND_CLASS_MAP( 1, "android/os/", UserManager), FIND_CLASS_MAP( 1, "java/net/", InterfaceAddress), FIND_CLASS_MAP( 1, "java/net/", NetworkInterface), { 21, &AudioFormat_Builder_Class, "android/media/AudioFormat$Builder" }, { 23, &AudioTrack_Builder_Class, "android/media/AudioTrack$Builder" }, { 23, &AudioRecord_Builder_Class, "android/media/AudioRecord$Builder" }, FIND_CLASS_MAP( 1, "android/os/", Process), FIND_CLASS_MAP(19, "android/app/", AppOpsManager), FIND_CLASS_MAP( 1, "java/lang/", Enum), FIND_CLASS_MAP( 1, "java/net/", SocketAddress), FIND_CLASS_MAP( 1, "java/net/", InetSocketAddress), FIND_CLASS_MAP( 1, "java/net/", URI), { 1, &Proxy_Type_Class, "java/net/Proxy$Type" }, FIND_CLASS_MAP( 1, "java/net/", Proxy), FIND_CLASS_MAP( 1, "java/net/", ProxySelector), FIND_CLASS_MAP( 5, "android/accounts/", Account), FIND_CLASS_MAP( 5, "android/accounts/", AccountManager), }; #define GET_STATIC_FIELD_MAP(min_version,clazz,name) { min_version, &clazz##_##name, &clazz##_Class, #name } typedef struct get_static_char_field_map { int min_version; jchar *p_value; jclass *p_class; const char *name; } get_static_char_field_map; static get_static_char_field_map get_static_char_field_map_table[] = { GET_STATIC_FIELD_MAP( 1, File, separatorChar), }; typedef struct get_static_int_field_map { int min_version; jint *p_value; jclass *p_class; const char *name; } get_static_int_field_map; static get_static_int_field_map get_static_int_field_map_table[] = { GET_STATIC_FIELD_MAP( 4, BuildVERSION, SDK_INT), GET_STATIC_FIELD_MAP( 1, AudioManager, MODE_NORMAL), GET_STATIC_FIELD_MAP( 1, AudioManager, MODE_RINGTONE), GET_STATIC_FIELD_MAP( 1, AudioManager, MODE_IN_CALL), { 1, &AudioManager_MODE_IN_COMMUNICATION, &AudioManager_Class, "MODE_IN_CALL" }, GET_STATIC_FIELD_MAP(11, AudioManager, MODE_IN_COMMUNICATION), GET_STATIC_FIELD_MAP( 1, AudioManager, MODE_CURRENT), GET_STATIC_FIELD_MAP( 1, AudioManager, MODE_INVALID), GET_STATIC_FIELD_MAP( 1, AudioManager, STREAM_VOICE_CALL), GET_STATIC_FIELD_MAP( 1, AudioManager, STREAM_SYSTEM), GET_STATIC_FIELD_MAP( 1, AudioManager, STREAM_RING), GET_STATIC_FIELD_MAP( 1, AudioManager, STREAM_MUSIC), GET_STATIC_FIELD_MAP( 1, AudioManager, STREAM_ALARM), GET_STATIC_FIELD_MAP( 3, AudioManager, STREAM_NOTIFICATION), GET_STATIC_FIELD_MAP( 1, AudioManager, ADJUST_LOWER), GET_STATIC_FIELD_MAP( 1, AudioManager, ADJUST_SAME), GET_STATIC_FIELD_MAP( 1, AudioManager, ADJUST_RAISE), GET_STATIC_FIELD_MAP( 8, AudioManager, AUDIOFOCUS_GAIN), GET_STATIC_FIELD_MAP( 8, AudioManager, AUDIOFOCUS_GAIN_TRANSIENT), GET_STATIC_FIELD_MAP( 8, AudioManager, AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK), GET_STATIC_FIELD_MAP(19, AudioManager, AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE), GET_STATIC_FIELD_MAP( 8, AudioManager, AUDIOFOCUS_REQUEST_GRANTED), GET_STATIC_FIELD_MAP( 8, AudioManager, AUDIOFOCUS_REQUEST_FAILED), GET_STATIC_FIELD_MAP(12, AudioGroup, MODE_ON_HOLD), GET_STATIC_FIELD_MAP(12, AudioGroup, MODE_MUTED), GET_STATIC_FIELD_MAP(12, AudioGroup, MODE_NORMAL), GET_STATIC_FIELD_MAP(12, AudioGroup, MODE_ECHO_SUPPRESSION), GET_STATIC_FIELD_MAP(12, RtpStream, MODE_NORMAL), GET_STATIC_FIELD_MAP(12, RtpStream, MODE_SEND_ONLY), GET_STATIC_FIELD_MAP(12, RtpStream, MODE_RECEIVE_ONLY), GET_STATIC_FIELD_MAP( 1, RingtoneManager, TYPE_RINGTONE), GET_STATIC_FIELD_MAP( 1, RingtoneManager, TYPE_NOTIFICATION), GET_STATIC_FIELD_MAP( 1, RingtoneManager, TYPE_ALARM), GET_STATIC_FIELD_MAP( 1, RingtoneManager, TYPE_ALL), GET_STATIC_FIELD_MAP( 1, ToneGenerator, MIN_VOLUME), GET_STATIC_FIELD_MAP( 1, ToneGenerator, MAX_VOLUME), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_0), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_1), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_2), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_3), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_4), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_5), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_6), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_7), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_8), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_9), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_S), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_P), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_A), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_B), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_C), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_DTMF_D), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_DIAL), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_BUSY), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_CONGESTION), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_RADIO_ACK), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_RADIO_NOTAVAIL), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_ERROR), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_CALL_WAITING), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_SUP_RINGTONE), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_PROP_BEEP), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_PROP_ACK), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_PROP_NACK), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_PROP_PROMPT), GET_STATIC_FIELD_MAP( 1, ToneGenerator, TONE_PROP_BEEP2), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_SUP_INTERCEPT), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_SUP_INTERCEPT_ABBREV), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_SUP_CONGESTION_ABBREV), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_SUP_CONFIRM), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_SUP_PIP), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_DIAL_TONE_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_NETWORK_USA_RINGBACK), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_INTERCEPT), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ABBR_INTERCEPT), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_REORDER), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ABBR_REORDER), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_NETWORK_BUSY), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CONFIRM), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ANSWER), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_NETWORK_CALLWAITING), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_PIP), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_PAT3), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_PAT5), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_PAT6), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALL_SIGNAL_ISDN_PAT7), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ALERT_NETWORK_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ALERT_AUTOREDIAL_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ONE_MIN_BEEP), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_KEYPAD_VOLUME_KEY_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_PRESSHOLDKEY_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ALERT_INCALL_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_EMERGENCY_RINGBACK), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ALERT_CALL_GUARD), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_SOFT_ERROR_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_CALLDROP_LITE), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_NETWORK_BUSY_ONE_SHOT), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_ABBR_ALERT), GET_STATIC_FIELD_MAP( 4, ToneGenerator, TONE_CDMA_SIGNAL_OFF), GET_STATIC_FIELD_MAP( 3, WifiManager, WIFI_MODE_FULL), GET_STATIC_FIELD_MAP( 3, WifiManager, WIFI_MODE_SCAN_ONLY), { 3, &WifiManager_WIFI_MODE_FULL_HIGH_PERF, &WifiManager_Class, "WIFI_MODE_FULL" }, GET_STATIC_FIELD_MAP(12, WifiManager, WIFI_MODE_FULL_HIGH_PERF), GET_STATIC_FIELD_MAP( 1, PowerManager, ACQUIRE_CAUSES_WAKEUP), GET_STATIC_FIELD_MAP( 1, PowerManager, ON_AFTER_RELEASE), GET_STATIC_FIELD_MAP( 1, PowerManager, PARTIAL_WAKE_LOCK), GET_STATIC_FIELD_MAP( 1, PowerManager, SCREEN_BRIGHT_WAKE_LOCK), GET_STATIC_FIELD_MAP( 1, PowerManager, SCREEN_DIM_WAKE_LOCK), GET_STATIC_FIELD_MAP( 3, AudioTrack, MODE_STATIC), GET_STATIC_FIELD_MAP( 3, AudioTrack, MODE_STREAM), GET_STATIC_FIELD_MAP(26, AudioTrack, PERFORMANCE_MODE_LOW_LATENCY), GET_STATIC_FIELD_MAP(26, AudioTrack, PERFORMANCE_MODE_NONE), GET_STATIC_FIELD_MAP(26, AudioTrack, PERFORMANCE_MODE_POWER_SAVING), GET_STATIC_FIELD_MAP( 3, AudioFormat, CHANNEL_CONFIGURATION_MONO), { 3, &AudioFormat_CHANNEL_IN_MONO, &AudioFormat_Class, "CHANNEL_CONFIGURATION_MONO" }, GET_STATIC_FIELD_MAP( 5, AudioFormat, CHANNEL_IN_MONO), { 3, &AudioFormat_CHANNEL_OUT_MONO, &AudioFormat_Class, "CHANNEL_CONFIGURATION_MONO" }, GET_STATIC_FIELD_MAP( 5, AudioFormat, CHANNEL_OUT_MONO), GET_STATIC_FIELD_MAP( 3, AudioFormat, ENCODING_PCM_16BIT), GET_STATIC_FIELD_MAP( 3, AudioRecord, RECORDSTATE_RECORDING), GET_STATIC_FIELD_MAP( 3, AudioRecord, RECORDSTATE_STOPPED), GET_STATIC_FIELD_MAP( 3, AudioRecord, STATE_INITIALIZED), GET_STATIC_FIELD_MAP( 3, AudioRecord, STATE_UNINITIALIZED), GET_STATIC_FIELD_MAP( 1, MediaRecorder_AudioSource, DEFAULT), GET_STATIC_FIELD_MAP( 1, MediaRecorder_AudioSource, MIC), GET_STATIC_FIELD_MAP( 4, MediaRecorder_AudioSource, VOICE_UPLINK), GET_STATIC_FIELD_MAP( 4, MediaRecorder_AudioSource, VOICE_DOWNLINK), { 1, &MediaRecorder_AudioSource_VOICE_CALL, &MediaRecorder_AudioSource_Class, "MIC" }, GET_STATIC_FIELD_MAP( 4, MediaRecorder_AudioSource, VOICE_CALL), GET_STATIC_FIELD_MAP( 7, MediaRecorder_AudioSource, CAMCORDER), GET_STATIC_FIELD_MAP( 7, MediaRecorder_AudioSource, VOICE_RECOGNITION), { 1, &MediaRecorder_AudioSource_VOICE_COMMUNICATION, &MediaRecorder_AudioSource_Class, "MIC" }, GET_STATIC_FIELD_MAP(11, MediaRecorder_AudioSource, VOICE_COMMUNICATION), GET_STATIC_FIELD_MAP( 8, ImageFormat, NV21), GET_STATIC_FIELD_MAP( 9, ImageFormat, YV12), GET_STATIC_FIELD_MAP(16, MediaCodecInfo_CodecCapabilities, COLOR_FormatYUV420Planar), GET_STATIC_FIELD_MAP(16, MediaCodecInfo_CodecCapabilities, COLOR_FormatYUV420SemiPlanar), GET_STATIC_FIELD_MAP(21, AudioAttributes, CONTENT_TYPE_MOVIE), GET_STATIC_FIELD_MAP(21, AudioAttributes, CONTENT_TYPE_MUSIC), GET_STATIC_FIELD_MAP(21, AudioAttributes, CONTENT_TYPE_SONIFICATION), GET_STATIC_FIELD_MAP(21, AudioAttributes, CONTENT_TYPE_SPEECH), GET_STATIC_FIELD_MAP(21, AudioAttributes, CONTENT_TYPE_UNKNOWN), GET_STATIC_FIELD_MAP(21, AudioAttributes, FLAG_AUDIBILITY_ENFORCED), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_ALARM), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_ASSISTANCE_ACCESSIBILITY), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_ASSISTANCE_NAVIGATION_GUIDANCE), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_ASSISTANCE_SONIFICATION), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_GAME), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_MEDIA), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_NOTIFICATION), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_NOTIFICATION_COMMUNICATION_DELAYED), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_NOTIFICATION_COMMUNICATION_INSTANT), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_NOTIFICATION_COMMUNICATION_REQUEST), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_NOTIFICATION_EVENT), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_NOTIFICATION_RINGTONE), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_UNKNOWN), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_VOICE_COMMUNICATION), GET_STATIC_FIELD_MAP(21, AudioAttributes, USAGE_VOICE_COMMUNICATION_SIGNALLING), GET_STATIC_FIELD_MAP(19, AppOpsManager, MODE_ALLOWED), GET_STATIC_FIELD_MAP(19, AppOpsManager, MODE_ERRORED), GET_STATIC_FIELD_MAP(19, AppOpsManager, MODE_IGNORED), }; static get_static_int_field_map get_static_enum_field_map_table[] = { GET_STATIC_FIELD_MAP( 1, Proxy_Type, DIRECT), GET_STATIC_FIELD_MAP( 1, Proxy_Type, HTTP), GET_STATIC_FIELD_MAP( 1, Proxy_Type, SOCKS), }; typedef struct get_static_string_field_map { int min_version; jstring *p_value; jclass *p_class; const char *name; } get_static_string_field_map; static get_static_string_field_map get_static_string_field_map_table[] = { GET_STATIC_FIELD_MAP( 1, Build, BOARD), GET_STATIC_FIELD_MAP( 1, Build, BRAND), GET_STATIC_FIELD_MAP( 1, Build, DEVICE), GET_STATIC_FIELD_MAP( 3, Build, DISPLAY), GET_STATIC_FIELD_MAP( 8, Build, HARDWARE), GET_STATIC_FIELD_MAP( 4, Build, MANUFACTURER), GET_STATIC_FIELD_MAP( 1, Build, MODEL), GET_STATIC_FIELD_MAP( 1, Build, PRODUCT), GET_STATIC_FIELD_MAP( 8, Build, RADIO), GET_STATIC_FIELD_MAP( 9, Build, SERIAL), GET_STATIC_FIELD_MAP( 1, BuildVERSION, RELEASE), GET_STATIC_FIELD_MAP( 1, Context, AUDIO_SERVICE), GET_STATIC_FIELD_MAP( 1, Context, WIFI_SERVICE), GET_STATIC_FIELD_MAP( 1, Context, POWER_SERVICE), GET_STATIC_FIELD_MAP( 1, Context, CONNECTIVITY_SERVICE), GET_STATIC_FIELD_MAP(17, Context, USER_SERVICE), GET_STATIC_FIELD_MAP(19, Context, APP_OPS_SERVICE), GET_STATIC_FIELD_MAP( 1, Settings_System, WIFI_STATIC_DNS1), GET_STATIC_FIELD_MAP( 1, Settings_System, WIFI_STATIC_DNS2), GET_STATIC_FIELD_MAP( 1, Settings_System, WIFI_STATIC_GATEWAY), GET_STATIC_FIELD_MAP( 1, Settings_System, WIFI_STATIC_IP), GET_STATIC_FIELD_MAP( 1, Settings_System, WIFI_STATIC_NETMASK), GET_STATIC_FIELD_MAP( 1, Settings_System, WIFI_USE_STATIC_IP), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_ALARMS), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_DCIM), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_DOWNLOADS), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_MOVIES), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_MUSIC), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_NOTIFICATIONS), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_PICTURES), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_PODCASTS), GET_STATIC_FIELD_MAP( 8, Environment, DIRECTORY_RINGTONES), GET_STATIC_FIELD_MAP( 1, Environment, MEDIA_MOUNTED), GET_STATIC_FIELD_MAP(23, AppOpsManager, OPSTR_RECORD_AUDIO), }; typedef struct get_static_object_field_map { int min_version; jobject *p_object; jclass *p_class; const char *name; const char *signature; } get_static_object_field_map; #define GET_STATIC_OBJECT_FIELD_MAP(min_version,clazz,name,signature) { min_version, &clazz##_##name, &clazz##_Class, #name, signature } typedef struct get_field_id_map { int min_version; jfieldID *p_id; jclass *p_class; const char *name; const char *signature; } get_field_id_map; #define GET_FIELD_ID_MAP(min_version,clazz,name,signature) { min_version, &clazz##_##name##_ID, &clazz##_Class, #name, signature } static get_field_id_map get_field_id_map_table[] = { GET_FIELD_ID_MAP(12, AudioCodec, type, "I"), GET_FIELD_ID_MAP(12, AudioCodec, rtpmap, "Ljava/lang/String;"), GET_FIELD_ID_MAP(12, AudioCodec, fmtp, "Ljava/lang/String;"), GET_FIELD_ID_MAP( 1, DhcpInfo, dns1, "I"), GET_FIELD_ID_MAP( 1, DhcpInfo, dns2, "I"), GET_FIELD_ID_MAP( 1, DhcpInfo, gateway, "I"), GET_FIELD_ID_MAP( 1, DhcpInfo, ipAddress, "I"), GET_FIELD_ID_MAP( 1, DhcpInfo, leaseDuration, "I"), GET_FIELD_ID_MAP( 1, DhcpInfo, netmask, "I"), GET_FIELD_ID_MAP( 1, DhcpInfo, serverAddress, "I"), GET_FIELD_ID_MAP( 5, Account, name, "Ljava/lang/String;"), GET_FIELD_ID_MAP( 5, Account, type, "Ljava/lang/String;"), }; typedef struct get_method_id_map { int min_version; jmethodID *p_id; jclass *p_class; const char *name; const char *signature; } get_method_id_map; #define GET_METHOD_ID_NEW(min_version,clazz,signature) { min_version, &clazz##_NewID, &clazz##_Class, "", signature } #define GET_METHOD_ID_MAP(min_version,clazz,name,signature) { min_version, &clazz##_##name##_ID, &clazz##_Class, #name, signature } static get_method_id_map get_method_id_map_table[] = { GET_METHOD_ID_MAP( 1, Integer, intValue, "()I"), GET_METHOD_ID_MAP( 1, Boolean, booleanValue, "()Z"), GET_METHOD_ID_MAP( 1, Context, getApplicationContext, "()Landroid/content/Context;"), GET_METHOD_ID_MAP( 8, Context, getExternalFilesDir, "(Ljava/lang/String;)Ljava/io/File;"), GET_METHOD_ID_MAP( 1, Context, getFilesDir, "()Ljava/io/File;"), GET_METHOD_ID_MAP( 1, Context, getPackageName, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, Context, getSystemService, "(Ljava/lang/String;)Ljava/lang/Object;"), GET_METHOD_ID_MAP( 8, AudioManager, abandonAudioFocus, "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I"), GET_METHOD_ID_MAP( 1, AudioManager, adjustVolume, "(II)V"), GET_METHOD_ID_MAP( 1, AudioManager, getMode, "()I"), GET_METHOD_ID_MAP( 1, AudioManager, getStreamMaxVolume, "(I)I"), GET_METHOD_ID_MAP( 1, AudioManager, getStreamVolume, "(I)I"), GET_METHOD_ID_MAP( 3, AudioManager, isBluetoothA2dpOn, "()Z"), GET_METHOD_ID_MAP( 8, AudioManager, isBluetoothScoAvailableOffCall, "()Z"), GET_METHOD_ID_MAP( 1, AudioManager, isBluetoothScoOn, "()Z"), GET_METHOD_ID_MAP( 1, AudioManager, isMusicActive, "()Z"), GET_METHOD_ID_MAP( 1, AudioManager, isSpeakerphoneOn, "()Z"), GET_METHOD_ID_MAP( 8, AudioManager, requestAudioFocus, "(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I"), { 26, &AudioManager_requestAudioFocus2_ID, &AudioManager_Class, "requestAudioFocus", "(Landroid/media/AudioFocusRequest;)I" }, GET_METHOD_ID_MAP( 3, AudioManager, setBluetoothA2dpOn, "(Z)V"), GET_METHOD_ID_MAP( 1, AudioManager, setBluetoothScoOn, "(Z)V"), GET_METHOD_ID_MAP( 1, AudioManager, setMicrophoneMute, "(Z)V"), GET_METHOD_ID_MAP( 1, AudioManager, setMode, "(I)V"), GET_METHOD_ID_MAP( 1, AudioManager, setSpeakerphoneOn, "(Z)V"), GET_METHOD_ID_MAP( 8, AudioManager, startBluetoothSco, "()V"), GET_METHOD_ID_MAP( 8, AudioManager, stopBluetoothSco, "()V"), GET_METHOD_ID_NEW(12, AudioGroup, "()V"), { 30, &AudioGroup_New2ID, &AudioGroup_Class, "", "(Landroid/content/Context;)V" }, GET_METHOD_ID_MAP(12, AudioGroup, clear, "()V"), GET_METHOD_ID_MAP(12, AudioGroup, setMode, "(I)V"), GET_METHOD_ID_MAP(12, AudioGroup, sendDtmf, "(I)V"), GET_METHOD_ID_MAP( 1, InetAddress, getAddress, "()[B"), GET_METHOD_ID_MAP(12, RtpStream, associate, "(Ljava/net/InetAddress;I)V"), GET_METHOD_ID_MAP(12, RtpStream, getLocalPort, "()I"), GET_METHOD_ID_MAP(12, RtpStream, release, "()V"), GET_METHOD_ID_MAP(12, RtpStream, setMode, "(I)V"), GET_METHOD_ID_NEW(12, AudioStream, "(Ljava/net/InetAddress;)V"), GET_METHOD_ID_MAP(12, AudioStream, setCodec, "(Landroid/net/rtp/AudioCodec;)V"), GET_METHOD_ID_MAP(12, AudioStream, setDtmfType, "(I)V"), GET_METHOD_ID_MAP(12, AudioStream, join, "(Landroid/net/rtp/AudioGroup;)V"), GET_METHOD_ID_MAP( 1, Ringtone, play, "()V"), GET_METHOD_ID_MAP(21, Ringtone, setAudioAttributes, "(Landroid/media/AudioAttributes;)V"), GET_METHOD_ID_MAP(28, Ringtone, setLooping, "(Z)V"), GET_METHOD_ID_MAP( 1, Ringtone, setStreamType, "(I)V"), GET_METHOD_ID_MAP(28, Ringtone, setVolume, "(F)V"), GET_METHOD_ID_MAP( 1, Ringtone, stop, "()V"), GET_METHOD_ID_NEW( 1, ToneGenerator, "(II)V"), GET_METHOD_ID_MAP( 1, ToneGenerator, release, "()V"), GET_METHOD_ID_MAP( 1, ToneGenerator, startTone, "(I)Z"), { 5, &ToneGenerator_startTone2_ID, &ToneGenerator_Class, "startTone", "(II)Z" }, GET_METHOD_ID_MAP( 1, ToneGenerator, stopTone, "()V"), GET_METHOD_ID_MAP( 4, WifiManager, createMulticastLock, "(Ljava/lang/String;)Landroid/net/wifi/WifiManager$MulticastLock;"), GET_METHOD_ID_MAP( 1, WifiManager, createWifiLock, "(Ljava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;"), { 3, &WifiManager_createWifiLock2_ID, &WifiManager_Class, "createWifiLock", "(ILjava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;" }, GET_METHOD_ID_MAP( 1, WifiManager, getConnectionInfo, "()Landroid/net/wifi/WifiInfo;"), GET_METHOD_ID_MAP( 1, WifiManager, getDhcpInfo, "()Landroid/net/DhcpInfo;"), GET_METHOD_ID_MAP( 1, WifiManager_WifiLock, acquire, "()V"), GET_METHOD_ID_MAP( 1, WifiManager_WifiLock, release, "()V"), GET_METHOD_ID_MAP( 1, WifiManager_WifiLock, setReferenceCounted, "(Z)V"), GET_METHOD_ID_MAP( 4, WifiManager_MulticastLock, acquire, "()V"), GET_METHOD_ID_MAP( 4, WifiManager_MulticastLock, release, "()V"), GET_METHOD_ID_MAP( 4, WifiManager_MulticastLock, setReferenceCounted, "(Z)V"), GET_METHOD_ID_MAP( 1, WifiInfo, getMacAddress, "()Ljava/lang/String;"), GET_METHOD_ID_NEW( 1, File, "(Ljava/lang/String;)V"), GET_METHOD_ID_MAP( 1, File, getAbsolutePath, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, File, getPath, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, PowerManager, newWakeLock, "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;"), GET_METHOD_ID_MAP( 1, PowerManager_WakeLock, acquire, "()V"), { 1, &PowerManager_WakeLock_acquire2_ID, &PowerManager_WakeLock_Class, "acquire", "(J)V" }, GET_METHOD_ID_MAP( 1, PowerManager_WakeLock, isHeld, "()Z"), GET_METHOD_ID_MAP( 1, PowerManager_WakeLock, release, "()V"), GET_METHOD_ID_MAP( 1, PowerManager_WakeLock, setReferenceCounted, "(Z)V"), GET_METHOD_ID_NEW( 3, AudioTrack, "(IIIIII)V"), { 9, &AudioTrack_New2ID, &AudioTrack_Class, "", "(IIIIIII)V" }, GET_METHOD_ID_MAP( 3, AudioTrack, flush, "()V"), GET_METHOD_ID_MAP( 9, AudioTrack, getAudioSessionId, "()I"), GET_METHOD_ID_MAP( 3, AudioTrack, getPlaybackHeadPosition, "()I"), GET_METHOD_ID_MAP( 3, AudioTrack, play, "()V"), GET_METHOD_ID_MAP( 3, AudioTrack, release, "()V"), GET_METHOD_ID_MAP( 3, AudioTrack, stop, "()V"), GET_METHOD_ID_MAP( 3, AudioTrack, write, "([SII)I"), GET_METHOD_ID_NEW( 3, AudioRecord, "(IIIII)V"), GET_METHOD_ID_MAP(16, AudioRecord, getAudioSessionId, "()I"), GET_METHOD_ID_MAP( 3, AudioRecord, getAudioSource, "()I"), GET_METHOD_ID_MAP( 3, AudioRecord, getRecordingState, "()I"), GET_METHOD_ID_MAP( 3, AudioRecord, getState, "()I"), GET_METHOD_ID_MAP( 3, AudioRecord, read, "([SII)I"), GET_METHOD_ID_MAP( 3, AudioRecord, release, "()V"), GET_METHOD_ID_MAP( 3, AudioRecord, setPositionNotificationPeriod, "(I)I"), GET_METHOD_ID_MAP( 3, AudioRecord, setRecordPositionUpdateListener, "(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;)V"), { 3, &AudioRecord_setRecordPositionUpdateListener2_ID, &AudioRecord_Class, "setRecordPositionUpdateListener", "(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;Landroid/os/Handler;)V" }, GET_METHOD_ID_MAP( 3, AudioRecord, startRecording, "()V"), GET_METHOD_ID_MAP( 3, AudioRecord, stop, "()V"), GET_METHOD_ID_MAP( 9, AudioEffect, getEnabled, "()Z"), GET_METHOD_ID_MAP( 9, AudioEffect, release, "()V"), GET_METHOD_ID_MAP( 9, AudioEffect, setEnabled, "(Z)I"), GET_METHOD_ID_MAP( 1, Handler, post, "(Ljava/lang/Runnable;)Z"), GET_METHOD_ID_MAP( 1, Handler, removeCallbacks, "(Ljava/lang/Runnable;)V"), GET_METHOD_ID_MAP( 1, Locale, getCountry, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, Locale, getISO3Language, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, Locale, getLanguage, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, UUID, getLeastSignificantBits, "()J"), GET_METHOD_ID_MAP( 1, UUID, getMostSignificantBits, "()J"), GET_METHOD_ID_MAP(21, ConnectivityManager, getAllNetworks, "()[Landroid/net/Network;"), GET_METHOD_ID_MAP(21, ConnectivityManager, getNetworkInfo, "(Landroid/net/Network;)Landroid/net/NetworkInfo;"), GET_METHOD_ID_MAP(21, ConnectivityManager, getLinkProperties, "(Landroid/net/Network;)Landroid/net/LinkProperties;"), GET_METHOD_ID_MAP( 1, NetworkInfo, isConnected, "()Z"), GET_METHOD_ID_MAP(21, LinkProperties, getDnsServers, "()Ljava/util/List;"), GET_METHOD_ID_MAP( 1, List, size, "()I"), GET_METHOD_ID_MAP( 1, List, get, "(I)Ljava/lang/Object;"), GET_METHOD_ID_MAP( 1, Enumeration, hasMoreElements, "()Z"), GET_METHOD_ID_MAP( 1, Enumeration, nextElement, "()Ljava/lang/Object;"), GET_METHOD_ID_NEW(21, AudioAttributes_Builder, "()V"), GET_METHOD_ID_MAP(21, AudioAttributes_Builder, build, "()Landroid/media/AudioAttributes;"), GET_METHOD_ID_MAP(21, AudioAttributes_Builder, setContentType, "(I)Landroid/media/AudioAttributes$Builder;"), GET_METHOD_ID_MAP(21, AudioAttributes_Builder, setFlags, "(I)Landroid/media/AudioAttributes$Builder;"), GET_METHOD_ID_MAP(21, AudioAttributes_Builder, setLegacyStreamType, "(I)Landroid/media/AudioAttributes$Builder;"), GET_METHOD_ID_MAP(21, AudioAttributes_Builder, setUsage, "(I)Landroid/media/AudioAttributes$Builder;"), GET_METHOD_ID_NEW(26, AudioFocusRequest_Builder, "(I)V"), GET_METHOD_ID_MAP(26, AudioFocusRequest_Builder, build, "()Landroid/media/AudioFocusRequest;"), GET_METHOD_ID_MAP(26, AudioFocusRequest_Builder, setAcceptsDelayedFocusGain, "(Z)Landroid/media/AudioFocusRequest$Builder;"), GET_METHOD_ID_MAP(26, AudioFocusRequest_Builder, setAudioAttributes, "(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;"), GET_METHOD_ID_MAP(26, AudioFocusRequest_Builder, setFocusGain, "(I)Landroid/media/AudioFocusRequest$Builder;"), GET_METHOD_ID_MAP( 1, Bundle, getBoolean, "(Ljava/lang/String;)Z"), GET_METHOD_ID_MAP( 1, Bundle, getInt, "(Ljava/lang/String;)I"), GET_METHOD_ID_MAP( 1, Bundle, getLong, "(Ljava/lang/String;)J"), GET_METHOD_ID_MAP( 1, Bundle, getString, "(Ljava/lang/String;)Ljava/lang/String;"), GET_METHOD_ID_MAP(18, UserManager, getApplicationRestrictions, "(Ljava/lang/String;)Landroid/os/Bundle;"), GET_METHOD_ID_MAP( 9, InterfaceAddress, getAddress, "()Ljava/net/InetAddress;"), GET_METHOD_ID_MAP( 9, InterfaceAddress, getNetworkPrefixLength, "()S"), GET_METHOD_ID_MAP( 1, NetworkInterface, getIndex, "()I"), GET_METHOD_ID_MAP( 1, NetworkInterface, getInetAddresses, "()Ljava/util/Enumeration;"), GET_METHOD_ID_MAP( 1, NetworkInterface, getInterfaceAddresses, "()Ljava/util/List;"), GET_METHOD_ID_MAP( 1, NetworkInterface, getName, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 9, NetworkInterface, isUp, "()Z"), GET_METHOD_ID_NEW(21, AudioFormat_Builder, "()V"), GET_METHOD_ID_MAP(21, AudioFormat_Builder, build, "()Landroid/media/AudioFormat;"), GET_METHOD_ID_MAP(21, AudioFormat_Builder, setChannelMask, "(I)Landroid/media/AudioFormat$Builder;"), GET_METHOD_ID_MAP(21, AudioFormat_Builder, setEncoding, "(I)Landroid/media/AudioFormat$Builder;"), GET_METHOD_ID_MAP(21, AudioFormat_Builder, setSampleRate, "(I)Landroid/media/AudioFormat$Builder;"), GET_METHOD_ID_NEW(23, AudioTrack_Builder, "()V"), GET_METHOD_ID_MAP(23, AudioTrack_Builder, build, "()Landroid/media/AudioTrack;"), GET_METHOD_ID_MAP(23, AudioTrack_Builder, setAudioAttributes, "(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;"), GET_METHOD_ID_MAP(23, AudioTrack_Builder, setAudioFormat, "(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;"), GET_METHOD_ID_MAP(23, AudioTrack_Builder, setBufferSizeInBytes, "(I)Landroid/media/AudioTrack$Builder;"), GET_METHOD_ID_MAP(26, AudioTrack_Builder, setPerformanceMode, "(I)Landroid/media/AudioTrack$Builder;"), GET_METHOD_ID_MAP(23, AudioTrack_Builder, setSessionId, "(I)Landroid/media/AudioTrack$Builder;"), GET_METHOD_ID_MAP(23, AudioTrack_Builder, setTransferMode, "(I)Landroid/media/AudioTrack$Builder;"), GET_METHOD_ID_NEW(23, AudioRecord_Builder, "()V"), GET_METHOD_ID_MAP(23, AudioRecord_Builder, build, "()Landroid/media/AudioRecord;"), GET_METHOD_ID_MAP(23, AudioRecord_Builder, setAudioFormat, "(Landroid/media/AudioFormat;)Landroid/media/AudioRecord$Builder;"), GET_METHOD_ID_MAP(23, AudioRecord_Builder, setAudioSource, "(I)Landroid/media/AudioRecord$Builder;"), GET_METHOD_ID_MAP(23, AudioRecord_Builder, setBufferSizeInBytes, "(I)Landroid/media/AudioRecord$Builder;"), GET_METHOD_ID_MAP(31, AudioRecord_Builder, setContext, "(Landroid/content/Context;)Landroid/media/AudioRecord$Builder;"), GET_METHOD_ID_MAP(19, AppOpsManager, noteOpNoThrow, "(Ljava/lang/String;ILjava/lang/String;)I"), GET_METHOD_ID_MAP( 1, Enum, name, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, Enum, ordinal, "()I"), GET_METHOD_ID_MAP(19, InetSocketAddress, getHostString, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, InetSocketAddress, getPort, "()I"), GET_METHOD_ID_MAP( 1, Proxy, address, "()Ljava/net/SocketAddress;"), GET_METHOD_ID_MAP( 1, Proxy, type, "()Ljava/net/Proxy$Type;"), GET_METHOD_ID_MAP( 1, ProxySelector, select, "(Ljava/net/URI;)Ljava/util/List;"), GET_METHOD_ID_MAP( 5, AccountManager, getAccountsByType, "(Ljava/lang/String;)[Landroid/accounts/Account;"), GET_METHOD_ID_MAP( 5, AccountManager, getPassword, "(Landroid/accounts/Account;)Ljava/lang/String;"), GET_METHOD_ID_MAP( 5, AccountManager, getUserData, "(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;"), }; static get_method_id_map get_static_method_id_map_table[] = { GET_METHOD_ID_MAP( 1, InetAddress, getByAddress, "([B)Ljava/net/InetAddress;"), GET_METHOD_ID_MAP(12, AudioCodec, getCodec, "(ILjava/lang/String;Ljava/lang/String;)Landroid/net/rtp/AudioCodec;"), GET_METHOD_ID_MAP(12, AudioCodec, getCodecs, "()[Landroid/net/rtp/AudioCodec;"), GET_METHOD_ID_MAP( 1, RingtoneManager, getActualDefaultRingtoneUri, "(Landroid/content/Context;I)Landroid/net/Uri;"), GET_METHOD_ID_MAP( 1, RingtoneManager, getDefaultUri, "(I)Landroid/net/Uri;"), GET_METHOD_ID_MAP( 1, RingtoneManager, getRingtone, "(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/Ringtone;"), GET_METHOD_ID_MAP( 1, RingtoneManager, getValidRingtoneUri, "(Landroid/content/Context;)Landroid/net/Uri;"), GET_METHOD_ID_MAP( 3, AudioTrack, getMinBufferSize, "(III)I"), GET_METHOD_ID_MAP( 3, AudioTrack, getNativeOutputSampleRate, "(I)I"), GET_METHOD_ID_MAP( 3, AudioRecord, getMinBufferSize, "(III)I"), GET_METHOD_ID_MAP(16, AutomaticGainControl, create, "(I)Landroid/media/audiofx/AutomaticGainControl;"), GET_METHOD_ID_MAP(16, AutomaticGainControl, isAvailable, "()Z"), GET_METHOD_ID_MAP(16, AcousticEchoCanceler, create, "(I)Landroid/media/audiofx/AcousticEchoCanceler;"), GET_METHOD_ID_MAP(16, AcousticEchoCanceler, isAvailable, "()Z"), GET_METHOD_ID_MAP(16, NoiseSuppressor, create, "(I)Landroid/media/audiofx/NoiseSuppressor;"), GET_METHOD_ID_MAP(16, NoiseSuppressor, isAvailable, "()Z"), GET_METHOD_ID_MAP( 1, Uri, parse, "(Ljava/lang/String;)Landroid/net/Uri;"), GET_METHOD_ID_MAP( 1, Locale, getDefault, "()Ljava/util/Locale;"), GET_METHOD_ID_MAP( 1, SystemClock, elapsedRealtime, "()J"), GET_METHOD_ID_MAP( 1, Environment, getExternalStorageDirectory, "()Ljava/io/File;"), GET_METHOD_ID_MAP( 1, Environment, getExternalStorageState, "()Ljava/lang/String;"), GET_METHOD_ID_MAP( 1, UUID, randomUUID, "()Ljava/util/UUID;"), GET_METHOD_ID_MAP( 1, NetworkInterface, getNetworkInterfaces, "()Ljava/util/Enumeration;"), GET_METHOD_ID_MAP( 2, Process, myUid, "()I"), GET_METHOD_ID_MAP( 1, URI, create, "(Ljava/lang/String;)Ljava/net/URI;"), GET_METHOD_ID_MAP( 1, ProxySelector, getDefault, "()Ljava/net/ProxySelector;"), GET_METHOD_ID_MAP( 5, AccountManager, get, "(Landroid/content/Context;)Landroid/accounts/AccountManager;"), }; jint phone_android_jni_enum_ordinal_cleanup(JNIEnv *phone_android_jni_env, jobject obj) { jint ordinal = Enum_ordinal(obj); phone_android_jni_env->DeleteLocalRef(obj); return ordinal; } void phone_android_jni_init(JNIEnv *phone_android_jni_env) { jfieldID field_id; jobject local_ref; jstring build_version_sdk; int build_version_sdk_int; jboolean bool_result; const char *p; char buf[1024]; unsigned int i, j; local_ref = phone_android_jni_env->FindClass("android/os/Build$VERSION"); field_id = phone_android_jni_env->GetStaticFieldID((jclass) local_ref, "SDK", "Ljava/lang/String;"); build_version_sdk = (jstring)(phone_android_jni_env->GetStaticObjectField((jclass) local_ref, field_id)); p = phone_android_jni_env->GetStringUTFChars(build_version_sdk, &bool_result); build_version_sdk_int = 0; i = 0; while(p[i] != '\0') { build_version_sdk_int = 10 * build_version_sdk_int + (p[i] - '0'); i++; } phone_android_jni_env->ReleaseStringUTFChars(build_version_sdk, p); phone_android_jni_env->DeleteLocalRef(build_version_sdk); phone_android_jni_env->DeleteLocalRef(local_ref); for(i = 0; i < sizeof(find_class_map_table)/sizeof(find_class_map_table[0]); i++) { *(find_class_map_table[i].p_class) = 0; } for(i = 0; i < sizeof(get_static_char_field_map_table)/sizeof(get_static_char_field_map_table[0]); i++) { *(get_static_char_field_map_table[i].p_value) = 0; } for(i = 0; i < sizeof(get_static_int_field_map_table)/sizeof(get_static_int_field_map_table[0]); i++) { *(get_static_int_field_map_table[i].p_value) = 0; } for(i = 0; i < sizeof(get_static_string_field_map_table)/sizeof(get_static_string_field_map_table[0]); i++) { *(get_static_string_field_map_table[i].p_value) = 0; } for(i = 0; i < sizeof(get_field_id_map_table)/sizeof(get_field_id_map_table[0]); i++) { *(get_field_id_map_table[i].p_id) = 0; } for(i = 0; i < sizeof(get_method_id_map_table)/sizeof(get_method_id_map_table[0]); i++) { *(get_method_id_map_table[i].p_id) = 0; } for(i = 0; i < sizeof(get_static_method_id_map_table)/sizeof(get_static_method_id_map_table[0]); i++) { *(get_static_method_id_map_table[i].p_id) = 0; } BuildVERSION_SDK_INT = build_version_sdk_int; for(i = 0; i < sizeof(find_class_map_table)/sizeof(find_class_map_table[0]); i++) { if(build_version_sdk_int >= find_class_map_table[i].min_version) { local_ref = phone_android_jni_env->FindClass(find_class_map_table[i].name); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); ERR(("No class exception %s", find_class_map_table[i].name)); } else if(!local_ref) { ERR(("No class %s", find_class_map_table[i].name)); } else { *(find_class_map_table[i].p_class) = (jclass)(phone_android_jni_env->NewGlobalRef(local_ref)); phone_android_jni_env->DeleteLocalRef(local_ref); } } } for(i = 0; i < sizeof(get_static_char_field_map_table)/sizeof(get_static_char_field_map_table[0]); i++) { if((build_version_sdk_int >= get_static_char_field_map_table[i].min_version) && *(get_static_char_field_map_table[i].p_class)) { field_id = phone_android_jni_env->GetStaticFieldID(*(get_static_char_field_map_table[i].p_class), get_static_char_field_map_table[i].name, "C"); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_static_char_field_map_table[i].p_class)); *(get_static_char_field_map_table[i].p_class) = 0; j = 0; while(find_class_map_table[j].p_class != get_static_char_field_map_table[i].p_class) { j++; } ERR(("No const exception %s.%s %s", find_class_map_table[j].name, get_static_char_field_map_table[i].name, "C")); } else if(!field_id) { j = 0; while(find_class_map_table[j].p_class != get_static_char_field_map_table[i].p_class) { j++; } ERR(("No const %s.%s %s", find_class_map_table[j].name, get_static_char_field_map_table[i].name, "C")); } else { *(get_static_char_field_map_table[i].p_value) = phone_android_jni_env->GetStaticCharField( *(get_static_char_field_map_table[i].p_class), field_id); } } } for(i = 0; i < sizeof(get_static_int_field_map_table)/sizeof(get_static_int_field_map_table[0]); i++) { if((build_version_sdk_int >= get_static_int_field_map_table[i].min_version) && *(get_static_int_field_map_table[i].p_class)) { field_id = phone_android_jni_env->GetStaticFieldID(*(get_static_int_field_map_table[i].p_class), get_static_int_field_map_table[i].name, "I"); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_static_int_field_map_table[i].p_class)); *(get_static_int_field_map_table[i].p_class) = 0; j = 0; while(find_class_map_table[j].p_class != get_static_int_field_map_table[i].p_class) { j++; } ERR(("No const exception %s.%s %s", find_class_map_table[j].name, get_static_int_field_map_table[i].name, "I")); } else if(!field_id) { j = 0; while(find_class_map_table[j].p_class != get_static_int_field_map_table[i].p_class) { j++; } ERR(("No const %s.%s %s", find_class_map_table[j].name, get_static_int_field_map_table[i].name, "I")); } else { *(get_static_int_field_map_table[i].p_value) = phone_android_jni_env->GetStaticIntField( *(get_static_int_field_map_table[i].p_class), field_id); } } } for(i = 0; i < sizeof(get_static_string_field_map_table)/sizeof(get_static_string_field_map_table[0]); i++) { if((build_version_sdk_int >= get_static_string_field_map_table[i].min_version) && *(get_static_string_field_map_table[i].p_class)) { field_id = phone_android_jni_env->GetStaticFieldID(*(get_static_string_field_map_table[i].p_class), get_static_string_field_map_table[i].name, "Ljava/lang/String;"); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_static_string_field_map_table[i].p_class)); *(get_static_string_field_map_table[i].p_class) = 0; j = 0; while(find_class_map_table[j].p_class != get_static_string_field_map_table[i].p_class) { j++; } ERR(("No string exception %s.%s %s", find_class_map_table[j].name, get_static_string_field_map_table[i].name, "Ljava/lang/String;")); } else if(!field_id) { j = 0; while(find_class_map_table[j].p_class != get_static_string_field_map_table[i].p_class) { j++; } ERR(("No string %s.%s %s", find_class_map_table[j].name, get_static_string_field_map_table[i].name, "Ljava/lang/String;")); } else { local_ref = phone_android_jni_env->GetStaticObjectField(*(get_static_string_field_map_table[i].p_class), field_id); *(get_static_string_field_map_table[i].p_value) = (jstring)(phone_android_jni_env->NewGlobalRef(local_ref)); phone_android_jni_env->DeleteLocalRef(local_ref); } } } for(i = 0; i < sizeof(get_field_id_map_table)/sizeof(get_field_id_map_table[0]); i++) { if((build_version_sdk_int >= get_field_id_map_table[i].min_version) && *(get_field_id_map_table[i].p_class)) { *(get_field_id_map_table[i].p_id) = phone_android_jni_env->GetFieldID(*(get_field_id_map_table[i].p_class), get_field_id_map_table[i].name, get_field_id_map_table[i].signature); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_field_id_map_table[i].p_class)); *(get_field_id_map_table[i].p_class) = 0; *(get_field_id_map_table[i].p_id) = 0; j = 0; while(find_class_map_table[j].p_class != get_field_id_map_table[i].p_class) { j++; } ERR(("No field exception %s.%s %s", find_class_map_table[j].name, get_field_id_map_table[i].name, get_field_id_map_table[i].signature)); } else if(!*(get_field_id_map_table[i].p_id)) { j = 0; while(find_class_map_table[j].p_class != get_field_id_map_table[i].p_class) { j++; } ERR(("No field %s.%s %s", find_class_map_table[j].name, get_field_id_map_table[i].name, get_field_id_map_table[i].signature)); } } } for(i = 0; i < sizeof(get_method_id_map_table)/sizeof(get_method_id_map_table[0]); i++) { if((build_version_sdk_int >= get_method_id_map_table[i].min_version) && *(get_method_id_map_table[i].p_class)) { *(get_method_id_map_table[i].p_id) = phone_android_jni_env->GetMethodID(*(get_method_id_map_table[i].p_class), get_method_id_map_table[i].name, get_method_id_map_table[i].signature); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_method_id_map_table[i].p_class)); *(get_method_id_map_table[i].p_class) = 0; *(get_method_id_map_table[i].p_id) = 0; j = 0; while(find_class_map_table[j].p_class != get_method_id_map_table[i].p_class) { j++; } ERR(("No method exception %s.%s %s", find_class_map_table[j].name, get_method_id_map_table[i].name, get_method_id_map_table[i].signature)); } else if(!*(get_method_id_map_table[i].p_id)) { j = 0; while(find_class_map_table[j].p_class != get_method_id_map_table[i].p_class) { j++; } ERR(("No method %s.%s %s", find_class_map_table[j].name, get_method_id_map_table[i].name, get_method_id_map_table[i].signature)); } } } for(i = 0; i < sizeof(get_static_method_id_map_table)/sizeof(get_static_method_id_map_table[0]); i++) { if((build_version_sdk_int >= get_static_method_id_map_table[i].min_version) && *(get_static_method_id_map_table[i].p_class)) { *(get_static_method_id_map_table[i].p_id) = phone_android_jni_env->GetStaticMethodID(*(get_static_method_id_map_table[i].p_class), get_static_method_id_map_table[i].name, get_static_method_id_map_table[i].signature); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_static_method_id_map_table[i].p_class)); *(get_static_method_id_map_table[i].p_class) = 0; *(get_static_method_id_map_table[i].p_id) = 0; j = 0; while(find_class_map_table[j].p_class != get_static_method_id_map_table[i].p_class) { j++; } ERR(("No function exception %s.%s %s", find_class_map_table[j].name, get_static_method_id_map_table[i].name, get_static_method_id_map_table[i].signature)); } else if(!*(get_static_method_id_map_table[i].p_id)) { j = 0; while(find_class_map_table[j].p_class != get_static_method_id_map_table[i].p_class) { j++; } ERR(("No function %s.%s %s", find_class_map_table[j].name, get_static_method_id_map_table[i].name, get_static_method_id_map_table[i].signature)); } } } for(i = 0; i < sizeof(get_static_enum_field_map_table)/sizeof(get_static_enum_field_map_table[0]); i++) { if((build_version_sdk_int >= get_static_enum_field_map_table[i].min_version) && *(get_static_enum_field_map_table[i].p_class)) { j = 0; while(find_class_map_table[j].p_class != get_static_enum_field_map_table[i].p_class) { j++; } _sprintf(buf, "L%s;", find_class_map_table[j].name); field_id = phone_android_jni_env->GetStaticFieldID(*(get_static_enum_field_map_table[i].p_class), get_static_enum_field_map_table[i].name, buf); if(phone_android_jni_env->ExceptionCheck() != JNI_FALSE) { phone_android_jni_env->ExceptionClear(); phone_android_jni_env->DeleteGlobalRef(*(get_static_enum_field_map_table[i].p_class)); *(get_static_enum_field_map_table[i].p_class) = 0; ERR(("No enum exception %s.%s %s", find_class_map_table[j].name, get_static_enum_field_map_table[i].name, buf)); } else if(!field_id) { j = 0; while(find_class_map_table[j].p_class != get_static_enum_field_map_table[i].p_class) { j++; } ERR(("No enum %s.%s %s", find_class_map_table[j].name, get_static_enum_field_map_table[i].name, buf)); } else { *(get_static_enum_field_map_table[i].p_value) = phone_android_jni_enum_ordinal_cleanup( phone_android_jni_env, phone_android_jni_env->GetStaticObjectField(*(get_static_enum_field_map_table[i].p_class), field_id)); } } } } void phone_android_jni_finit(JNIEnv *phone_android_jni_env) { unsigned int i; for(i = 0; i < sizeof(find_class_map_table)/sizeof(find_class_map_table[0]); i++) { if(*(find_class_map_table[i].p_class)) { phone_android_jni_env->DeleteGlobalRef(*(find_class_map_table[i].p_class)); *(find_class_map_table[i].p_class) = 0; } } for(i = 0; i < sizeof(get_static_string_field_map_table)/sizeof(get_static_string_field_map_table[0]); i++) { if(*(get_static_string_field_map_table[i].p_value)) { phone_android_jni_env->DeleteGlobalRef(*(get_static_string_field_map_table[i].p_value)); *(get_static_string_field_map_table[i].p_value) = 0; } } } /*----------------------------------------------------------------------------*/