diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:44:00 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:44:00 -0800 |
commit | d24b8183b93e781080b2c16c487e60d51c12da31 (patch) | |
tree | fbb89154858984eb8e41556da7e9433040d55cd4 /core/jni | |
parent | f1e484acb594a726fb57ad0ae4cfe902c7f35858 (diff) | |
download | frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.zip frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.tar.gz frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.tar.bz2 |
auto import from //branches/cupcake/...@130745
Diffstat (limited to 'core/jni')
22 files changed, 645 insertions, 562 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 32c3a54..6e5c4e0 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -42,7 +42,6 @@ LOCAL_SRC_FILES:= \ android_os_SystemClock.cpp \ android_os_SystemProperties.cpp \ android_os_UEventObserver.cpp \ - android_os_NetStat.cpp \ android_os_Hardware.cpp \ android_net_LocalSocketImpl.cpp \ android_net_NetUtils.cpp \ @@ -146,7 +145,8 @@ LOCAL_SHARED_LIBRARIES := \ libcorecg \ libsqlite \ libdvm \ - libGLES_CM \ + libEGL \ + libGLESv1_CM \ libhardware \ libhardware_legacy \ libsonivox \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 097ffac..40dc2a1 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -129,7 +129,6 @@ extern int register_android_os_SystemClock(JNIEnv* env); extern int register_android_os_FileObserver(JNIEnv *env); extern int register_android_os_FileUtils(JNIEnv *env); extern int register_android_os_UEventObserver(JNIEnv* env); -extern int register_android_os_NetStat(JNIEnv* env); extern int register_android_os_MemoryFile(JNIEnv* env); extern int register_android_net_LocalSocketImpl(JNIEnv* env); extern int register_android_net_NetworkUtils(JNIEnv* env); @@ -502,6 +501,7 @@ void AndroidRuntime::start(const char* className, const bool startSystemServer) JavaVMOption opt; char propBuf[PROPERTY_VALUE_MAX]; char stackTraceFileBuf[PROPERTY_VALUE_MAX]; + char dexoptFlagsBuf[PROPERTY_VALUE_MAX]; char enableAssertBuf[sizeof("-ea:")-1 + PROPERTY_VALUE_MAX]; char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX]; char* stackTraceFile = NULL; @@ -509,7 +509,6 @@ void AndroidRuntime::start(const char* className, const bool startSystemServer) char* cp; bool checkJni = false; bool logStdio = false; - bool verifyJava = true; enum { kEMDefault, kEMIntPortable, kEMIntFast } executionMode = kEMDefault; blockSigpipe(); @@ -536,15 +535,6 @@ void AndroidRuntime::start(const char* className, const bool startSystemServer) } } - property_get("dalvik.vm.verify-bytecode", propBuf, ""); - if (strcmp(propBuf, "true") == 0) { - verifyJava = true; - } else if (strcmp(propBuf, "false") == 0) { - verifyJava = false; - } else { - /* bad value or not defined; use default */ - } - property_get("dalvik.vm.execution-mode", propBuf, ""); if (strcmp(propBuf, "int:portable") == 0) { executionMode = kEMIntPortable; @@ -609,21 +599,49 @@ void AndroidRuntime::start(const char* className, const bool startSystemServer) mOptions.add(opt); /* - * Enable or disable bytecode verification. - * - * We don't optimize classes that haven't been verified, but that only - * matters if we do "just-in-time" DEX optimization. + * Enable or disable dexopt features, such as bytecode verification and + * calculation of register maps for precise GC. */ - if (verifyJava) { - opt.optionString = "-Xverify:all"; - mOptions.add(opt); - opt.optionString = "-Xdexopt:verified"; - mOptions.add(opt); - } else { - opt.optionString = "-Xverify:none"; - mOptions.add(opt); - opt.optionString = "-Xdexopt:verified"; - mOptions.add(opt); + property_get("dalvik.vm.dexopt-flags", dexoptFlagsBuf, ""); + if (dexoptFlagsBuf[0] != '\0') { + const char* opc; + const char* val; + + opc = strstr(dexoptFlagsBuf, "v="); /* verification */ + if (opc != NULL) { + switch (*(opc+2)) { + case 'n': val = "-Xverify:none"; break; + case 'r': val = "-Xverify:remote"; break; + case 'a': val = "-Xverify:all"; break; + default: val = NULL; break; + } + + if (val != NULL) { + opt.optionString = val; + mOptions.add(opt); + } + } + + opc = strstr(dexoptFlagsBuf, "o="); /* optimization */ + if (opc != NULL) { + switch (*(opc+2)) { + case 'n': val = "-Xdexopt:none"; break; + case 'v': val = "-Xdexopt:verified"; break; + case 'a': val = "-Xdexopt:all"; break; + default: val = NULL; break; + } + + if (val != NULL) { + opt.optionString = val; + mOptions.add(opt); + } + } + + opc = strstr(dexoptFlagsBuf, "m=y"); /* register map */ + if (opc != NULL) { + opt.optionString = "-Xgenregmap"; + mOptions.add(opt); + } } /* enable debugging; set suspend=y to pause during VM init */ @@ -1066,7 +1084,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_net_LocalSocketImpl), REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_wifi_WifiManager), - REG_JNI(register_android_os_NetStat), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_ZygoteInit), REG_JNI(register_android_hardware_Camera), diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index be8526d..332b01c 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -1,3 +1,5 @@ +#define LOG_TAG "BitmapFactory" + #include "SkImageDecoder.h" #include "SkPixelRef.h" #include "SkStream.h" @@ -481,6 +483,48 @@ static void nativeRequestCancel(JNIEnv*, jobject joptions) { (void)AutoDecoderCancel::RequestCancel(joptions); } +static jbyteArray nativeScaleNinePatch(JNIEnv* env, jobject, jbyteArray chunkObject, jfloat scale, + jobject padding) { + + jbyte* array = env->GetByteArrayElements(chunkObject, 0); + if (array != NULL) { + size_t chunkSize = env->GetArrayLength(chunkObject); + void* storage = alloca(chunkSize); + android::Res_png_9patch* chunk = static_cast<android::Res_png_9patch*>(storage); + memcpy(chunk, array, chunkSize); + android::Res_png_9patch::deserialize(chunk); + + chunk->paddingLeft = int(chunk->paddingLeft * scale + 0.5f); + chunk->paddingTop = int(chunk->paddingTop * scale + 0.5f); + chunk->paddingRight = int(chunk->paddingRight * scale + 0.5f); + chunk->paddingBottom = int(chunk->paddingBottom * scale + 0.5f); + + for (int i = 0; i < chunk->numXDivs; i++) { + chunk->xDivs[i] = int(chunk->xDivs[i] * scale + 0.5f); + if (i > 0 && chunk->xDivs[i] == chunk->xDivs[i - 1]) { + chunk->xDivs[i]++; + } + } + + for (int i = 0; i < chunk->numYDivs; i++) { + chunk->yDivs[i] = int(chunk->yDivs[i] * scale + 0.5f); + if (i > 0 && chunk->yDivs[i] == chunk->yDivs[i - 1]) { + chunk->yDivs[i]++; + } + } + + memcpy(array, chunk, chunkSize); + + if (padding) { + GraphicsJNI::set_jrect(env, padding, chunk->paddingLeft, chunk->paddingTop, + chunk->paddingRight, chunk->paddingBottom); + } + + env->ReleaseByteArrayElements(chunkObject, array, 0); + } + return chunkObject; +} + /////////////////////////////////////////////////////////////////////////////// static JNINativeMethod gMethods[] = { @@ -502,7 +546,13 @@ static JNINativeMethod gMethods[] = { { "nativeDecodeByteArray", "([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;", (void*)nativeDecodeByteArray + }, + + { "nativeScaleNinePatch", + "([BFLandroid/graphics/Rect;)[B", + (void*)nativeScaleNinePatch } + }; static JNINativeMethod gOptionsMethods[] = { diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index b9e5f67..605e4b8 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -93,7 +93,7 @@ public: SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, jcanvas); return canvas->getDevice()->accessBitmap(false).height(); } - + static void setViewport(JNIEnv* env, jobject, SkCanvas* canvas, int width, int height) { canvas->setViewport(width, height); @@ -454,13 +454,32 @@ public: #endif } - static void drawBitmap__BitmapFFPaint(JNIEnv* env, jobject, + static void drawBitmap__BitmapFFPaint(JNIEnv* env, jobject jcanvas, SkCanvas* canvas, SkBitmap* bitmap, jfloat left, jfloat top, - SkPaint* paint) { + SkPaint* paint, + jboolean autoScale, jfloat densityScale) { SkScalar left_ = SkFloatToScalar(left); SkScalar top_ = SkFloatToScalar(top); - canvas->drawBitmap(*bitmap, left_, top_, paint); + + if (!autoScale || densityScale <= 0.0f) { + canvas->drawBitmap(*bitmap, left_, top_, paint); + } else { + canvas->save(); + SkScalar canvasScale = GraphicsJNI::getCanvasDensityScale(env, jcanvas); + SkScalar scale = canvasScale / SkFloatToScalar(densityScale); + canvas->scale(scale, scale); + + SkPaint filteredPaint; + if (paint) { + filteredPaint = *paint; + } + filteredPaint.setFilterBitmap(true); + + canvas->drawBitmap(*bitmap, left_, top_, &filteredPaint); + + canvas->restore(); + } } static void doDrawBitmap(JNIEnv* env, SkCanvas* canvas, SkBitmap* bitmap, @@ -492,7 +511,7 @@ public: static void drawBitmapArray(JNIEnv* env, jobject, SkCanvas* canvas, jintArray jcolors, int offset, int stride, - int x, int y, int width, int height, + jfloat x, jfloat y, int width, int height, jboolean hasAlpha, SkPaint* paint) { SkBitmap bitmap; @@ -508,7 +527,8 @@ public: return; } - canvas->drawBitmap(bitmap, SkIntToScalar(x), SkIntToScalar(y), paint); + canvas->drawBitmap(bitmap, SkFloatToScalar(x), SkFloatToScalar(y), + paint); } static void drawBitmapMatrix(JNIEnv* env, jobject, SkCanvas* canvas, @@ -882,13 +902,13 @@ static JNINativeMethod gCanvasMethods[] = { {"native_drawRoundRect","(ILandroid/graphics/RectF;FFI)V", (void*) SkCanvasGlue::drawRoundRect}, {"native_drawPath","(III)V", (void*) SkCanvasGlue::drawPath}, - {"native_drawBitmap","(IIFFI)V", + {"native_drawBitmap","(IIFFIZF)V", (void*) SkCanvasGlue::drawBitmap__BitmapFFPaint}, {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/RectF;I)V", (void*) SkCanvasGlue::drawBitmapRF}, {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/Rect;I)V", (void*) SkCanvasGlue::drawBitmapRR}, - {"native_drawBitmap", "(I[IIIIIIIZI)V", + {"native_drawBitmap", "(I[IIIFFIIZI)V", (void*)SkCanvasGlue::drawBitmapArray}, {"nativeDrawBitmapMatrix", "(IIII)V", diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp index 65c2326..a285def 100644 --- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp +++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp @@ -56,11 +56,14 @@ public: break; // eof } - const jbyte* array = env->GetByteArrayElements(fJavaByteArray, - NULL); - memcpy(buffer, array, n); - env->ReleaseByteArrayElements(fJavaByteArray, - const_cast<jbyte*>(array), JNI_ABORT); + env->GetByteArrayRegion(fJavaByteArray, 0, n, + reinterpret_cast<jbyte*>(buffer)); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + SkDebugf("---- read:GetByteArrayRegion threw an exception\n"); + return 0; + } buffer = (void*)((char*)buffer + n); bytesRead += n; @@ -189,10 +192,15 @@ public: requested = fCapacity; } - jbyte* array = env->GetByteArrayElements(storage, NULL); - memcpy(array, buffer, requested); - env->ReleaseByteArrayElements(storage, array, 0); - + env->SetByteArrayRegion(storage, 0, requested, + reinterpret_cast<const jbyte*>(buffer)); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + SkDebugf("--- write:SetByteArrayElements threw an exception\n"); + return false; + } + fEnv->CallVoidMethod(fJavaOutputStream, gOutputStream_writeMethodID, storage, 0, requested); if (env->ExceptionCheck()) { diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 44113e5..6eebbdc 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -162,6 +162,7 @@ static jfieldID gBitmapConfig_nativeInstanceID; static jclass gCanvas_class; static jfieldID gCanvas_nativeInstanceID; +static jfieldID gCanvas_densityScaleID; static jclass gPaint_class; static jfieldID gPaint_nativeInstanceID; @@ -318,6 +319,13 @@ SkCanvas* GraphicsJNI::getNativeCanvas(JNIEnv* env, jobject canvas) { return c; } +SkScalar GraphicsJNI::getCanvasDensityScale(JNIEnv* env, jobject canvas) { + SkASSERT(env); + SkASSERT(canvas); + SkASSERT(env->IsInstanceOf(canvas, gCanvas_class)); + return SkFloatToScalar(env->GetFloatField(canvas, gCanvas_densityScaleID)); +} + SkPaint* GraphicsJNI::getNativePaint(JNIEnv* env, jobject paint) { SkASSERT(env); SkASSERT(paint); @@ -543,7 +551,8 @@ int register_android_graphics_Graphics(JNIEnv* env) gCanvas_class = make_globalref(env, "android/graphics/Canvas"); gCanvas_nativeInstanceID = getFieldIDCheck(env, gCanvas_class, "mNativeCanvas", "I"); - + gCanvas_densityScaleID = getFieldIDCheck(env, gCanvas_class, "mDensityScale", "F"); + gPaint_class = make_globalref(env, "android/graphics/Paint"); gPaint_nativeInstanceID = getFieldIDCheck(env, gPaint_class, "mNativePaint", "I"); diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index e67b20b..e2dc9ac 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -38,6 +38,7 @@ public: static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap); static SkPicture* getNativePicture(JNIEnv*, jobject picture); static SkRegion* getNativeRegion(JNIEnv*, jobject region); + static SkScalar getCanvasDensityScale(JNIEnv*, jobject canvas); /** Return the corresponding native config from the java Config enum, or kNo_Config if the java object is null. diff --git a/core/jni/android/graphics/NinePatch.cpp b/core/jni/android/graphics/NinePatch.cpp index 9e943f3..b11edfc 100644 --- a/core/jni/android/graphics/NinePatch.cpp +++ b/core/jni/android/graphics/NinePatch.cpp @@ -47,19 +47,17 @@ public: static void draw(JNIEnv* env, SkCanvas* canvas, SkRect& bounds, const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint) { - const jbyte* array = env->GetByteArrayElements(chunkObj, 0); - if (array != NULL) { - size_t chunkSize = env->GetArrayLength(chunkObj); + size_t chunkSize = env->GetArrayLength(chunkObj); + void* storage = alloca(chunkSize); + env->GetByteArrayRegion(chunkObj, 0, chunkSize, + reinterpret_cast<jbyte*>(storage)); + if (!env->ExceptionCheck()) { // need to deserialize the chunk - void* storage = alloca(chunkSize); Res_png_9patch* chunk = static_cast<Res_png_9patch*>(storage); - memcpy(chunk, array, chunkSize); assert(chunkSize == chunk->serializedSize()); // this relies on deserialization being done in place Res_png_9patch::deserialize(chunk); NinePatch_Draw(canvas, bounds, *bitmap, *chunk, paint, NULL); - env->ReleaseByteArrayElements(chunkObj, const_cast<jbyte*>(array), - JNI_ABORT); } } @@ -102,23 +100,20 @@ public: SkRect bounds; GraphicsJNI::jrect_to_rect(env, boundsRect, &bounds); - const jbyte* array = (jbyte*)env->GetByteArrayElements(chunkObj, 0); - if (array != NULL) { - size_t chunkSize = env->GetArrayLength(chunkObj); + size_t chunkSize = env->GetArrayLength(chunkObj); + void* storage = alloca(chunkSize); + env->GetByteArrayRegion(chunkObj, 0, chunkSize, + reinterpret_cast<jbyte*>(storage)); + if (!env->ExceptionCheck()) { // need to deserialize the chunk - void* storage = alloca(chunkSize); Res_png_9patch* chunk = static_cast<Res_png_9patch*>(storage); - memcpy(chunk, array, chunkSize); assert(chunkSize == chunk->serializedSize()); // this relies on deserialization being done in place Res_png_9patch::deserialize(chunk); SkRegion* region = NULL; NinePatch_Draw(NULL, bounds, *bitmap, *chunk, NULL, ®ion); - env->ReleaseByteArrayElements(chunkObj, const_cast<jbyte*>(array), - JNI_ABORT); return (jint)region; } - return 0; } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index a81f252..79965b9 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -259,7 +259,7 @@ static void android_hardware_Camera_setHasPreviewCallback(JNIEnv *env, jobject t } else { callback_flag = FRAME_CALLBACK_FLAG_NOOP; } - c->setFrameCallback(installed ? preview_callback : NULL, cookie, callback_flag); + c->setPreviewCallback(installed ? preview_callback : NULL, cookie, callback_flag); } static void autofocus_callback_impl(bool success, void *cookie) diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp index e4586d9..307c6fd 100644 --- a/core/jni/android_media_AudioRecord.cpp +++ b/core/jni/android_media_AudioRecord.cpp @@ -63,11 +63,11 @@ struct audiorecord_callback_cookie { #define AUDIORECORD_ERROR -1 #define AUDIORECORD_ERROR_BAD_VALUE -2 #define AUDIORECORD_ERROR_INVALID_OPERATION -3 -#define AUDIORECORD_ERROR_SETUP_ZEROFRAMECOUNT -4 -#define AUDIORECORD_ERROR_SETUP_INVALIDCHANNELCOUNT -5 -#define AUDIORECORD_ERROR_SETUP_INVALIDFORMAT -6 -#define AUDIORECORD_ERROR_SETUP_INVALIDSTREAMTYPE -7 -#define AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED -8 +#define AUDIORECORD_ERROR_SETUP_ZEROFRAMECOUNT -16 +#define AUDIORECORD_ERROR_SETUP_INVALIDCHANNELCOUNT -17 +#define AUDIORECORD_ERROR_SETUP_INVALIDFORMAT -18 +#define AUDIORECORD_ERROR_SETUP_INVALIDSTREAMTYPE -19 +#define AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED -20 jint android_media_translateRecorderErrorCode(int code) { switch(code) { diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 99785a2..6bd3655 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -55,6 +55,8 @@ android_media_AudioSystem_setVolume(JNIEnv *env, jobject clazz, jint type, jint LOGV("setVolume(%d)", int(volume)); if (int(type) == AudioTrack::VOICE_CALL) { return check_AudioSystem_Command(AudioSystem::setStreamVolume(type, float(volume) / 100.0)); + } else if (int(type) == AudioTrack::BLUETOOTH_SCO) { + return check_AudioSystem_Command(AudioSystem::setStreamVolume(type, float(1.0))); } else { return check_AudioSystem_Command(AudioSystem::setStreamVolume(type, AudioSystem::linearToLog(volume))); } diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 6bbcaee..bbecc1b 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -53,6 +53,7 @@ struct fields_t { int STREAM_MUSIC; //... stream type constants int STREAM_ALARM; //... stream type constants int STREAM_NOTIFICATION; //... stream type constants + int STREAM_BLUETOOTH_SCO; //... stream type constants int MODE_STREAM; //... memory mode int MODE_STATIC; //... memory mode jfieldID nativeTrackInJavaObj; // stores in Java the native AudioTrack object @@ -95,13 +96,13 @@ class AudioTrackJniStorage { #define AUDIOTRACK_SUCCESS 0 #define AUDIOTRACK_ERROR -1 -#define AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM -2 -#define AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELCOUNT -3 -#define AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT -4 -#define AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE -5 -#define AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED -6 -#define AUDIOTRACK_ERROR_BAD_VALUE -7 -#define AUDIOTRACK_ERROR_INVALID_OPERATION -8 +#define AUDIOTRACK_ERROR_BAD_VALUE -2 +#define AUDIOTRACK_ERROR_INVALID_OPERATION -3 +#define AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM -16 +#define AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELCOUNT -17 +#define AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT -18 +#define AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE -19 +#define AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED -20 jint android_media_translateErrorCode(int code) { @@ -195,10 +196,12 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th atStreamType = AudioTrack::ALARM; } else if (streamType == javaAudioTrackFields.STREAM_NOTIFICATION) { atStreamType = AudioTrack::NOTIFICATION; + } else if (streamType == javaAudioTrackFields.STREAM_BLUETOOTH_SCO) { + atStreamType = AudioTrack::BLUETOOTH_SCO; } else { LOGE("Error creating AudioTrack: unknown stream type."); return AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE; - } + } // check the format. // This function was called from Java, so we compare the format against the Java constants @@ -663,6 +666,35 @@ static jint android_media_AudioTrack_get_output_sample_rate(JNIEnv *env, jobjec // ---------------------------------------------------------------------------- +// returns the minimum required size for the successful creation of a streaming AudioTrack +static jint android_media_AudioTrack_get_min_buff_size(JNIEnv *env, jobject thiz, + jint sampleRateInHertz, jint nbChannels, jint audioFormat) { + int afSamplingRate; + int afFrameCount; + uint32_t afLatency; + + if (AudioSystem::getOutputSamplingRate(&afSamplingRate) != NO_ERROR) { + return -1; + } + if (AudioSystem::getOutputFrameCount(&afFrameCount) != NO_ERROR) { + return -1; + } + + if (AudioSystem::getOutputLatency(&afLatency) != NO_ERROR) { + return -1; + } + + // Ensure that buffer depth covers at least audio hardware latency + uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSamplingRate); + uint32_t minFrameCount = (afFrameCount*sampleRateInHertz*minBufCount)/afSamplingRate; + int minBuffSize = minFrameCount + * (audioFormat == javaAudioTrackFields.PCM16 ? 2 : 1) + * nbChannels; + return minBuffSize; +} + + +// ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { // name, signature, funcPtr @@ -695,24 +727,27 @@ static JNINativeMethod gMethods[] = { {"native_reload_static", "()I", (void *)android_media_AudioTrack_reload}, {"native_get_output_sample_rate", "()I", (void *)android_media_AudioTrack_get_output_sample_rate}, + {"native_get_min_buff_size", + "(III)I", (void *)android_media_AudioTrack_get_min_buff_size}, }; // field names found in android/media/AudioTrack.java -#define JAVA_POSTEVENT_CALLBACK_NAME "postEventFromNative" -#define JAVA_CONST_PCM16_NAME "ENCODING_PCM_16BIT" -#define JAVA_CONST_PCM8_NAME "ENCODING_PCM_8BIT" -#define JAVA_CONST_BUFFER_COUNT_NAME "BUFFER_COUNT" -#define JAVA_CONST_STREAM_VOICE_CALL_NAME "STREAM_VOICE_CALL" -#define JAVA_CONST_STREAM_SYSTEM_NAME "STREAM_SYSTEM" -#define JAVA_CONST_STREAM_RING_NAME "STREAM_RING" -#define JAVA_CONST_STREAM_MUSIC_NAME "STREAM_MUSIC" -#define JAVA_CONST_STREAM_ALARM_NAME "STREAM_ALARM" -#define JAVA_CONST_STREAM_NOTIFICATION_NAME "STREAM_NOTIFICATION" -#define JAVA_CONST_MODE_STREAM_NAME "MODE_STREAM" -#define JAVA_CONST_MODE_STATIC_NAME "MODE_STATIC" -#define JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME "mNativeTrackInJavaObj" -#define JAVA_JNIDATA_FIELD_NAME "mJniData" +#define JAVA_POSTEVENT_CALLBACK_NAME "postEventFromNative" +#define JAVA_CONST_PCM16_NAME "ENCODING_PCM_16BIT" +#define JAVA_CONST_PCM8_NAME "ENCODING_PCM_8BIT" +#define JAVA_CONST_BUFFER_COUNT_NAME "BUFFER_COUNT" +#define JAVA_CONST_STREAM_VOICE_CALL_NAME "STREAM_VOICE_CALL" +#define JAVA_CONST_STREAM_SYSTEM_NAME "STREAM_SYSTEM" +#define JAVA_CONST_STREAM_RING_NAME "STREAM_RING" +#define JAVA_CONST_STREAM_MUSIC_NAME "STREAM_MUSIC" +#define JAVA_CONST_STREAM_ALARM_NAME "STREAM_ALARM" +#define JAVA_CONST_STREAM_NOTIFICATION_NAME "STREAM_NOTIFICATION" +#define JAVA_CONST_STREAM_BLUETOOTH_SCO_NAME "STREAM_BLUETOOTH_SCO" +#define JAVA_CONST_MODE_STREAM_NAME "MODE_STREAM" +#define JAVA_CONST_MODE_STATIC_NAME "MODE_STATIC" +#define JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME "mNativeTrackInJavaObj" +#define JAVA_JNIDATA_FIELD_NAME "mJniData" #define JAVA_AUDIOFORMAT_CLASS_NAME "android/media/AudioFormat" #define JAVA_AUDIOMANAGER_CLASS_NAME "android/media/AudioManager" @@ -810,28 +845,32 @@ int register_android_media_AudioTrack(JNIEnv *env) LOGE("Can't find %s", JAVA_AUDIOMANAGER_CLASS_NAME); return -1; } - if ( !android_media_getIntConstantFromClass(env, audioManagerClass, - JAVA_AUDIOMANAGER_CLASS_NAME, + if ( !android_media_getIntConstantFromClass(env, audioManagerClass, + JAVA_AUDIOMANAGER_CLASS_NAME, JAVA_CONST_STREAM_VOICE_CALL_NAME, &(javaAudioTrackFields.STREAM_VOICE_CALL)) - || !android_media_getIntConstantFromClass(env, audioManagerClass, - JAVA_AUDIOMANAGER_CLASS_NAME, + || !android_media_getIntConstantFromClass(env, audioManagerClass, + JAVA_AUDIOMANAGER_CLASS_NAME, JAVA_CONST_STREAM_MUSIC_NAME, &(javaAudioTrackFields.STREAM_MUSIC)) - || !android_media_getIntConstantFromClass(env, audioManagerClass, - JAVA_AUDIOMANAGER_CLASS_NAME, + || !android_media_getIntConstantFromClass(env, audioManagerClass, + JAVA_AUDIOMANAGER_CLASS_NAME, JAVA_CONST_STREAM_SYSTEM_NAME, &(javaAudioTrackFields.STREAM_SYSTEM)) - || !android_media_getIntConstantFromClass(env, audioManagerClass, - JAVA_AUDIOMANAGER_CLASS_NAME, + || !android_media_getIntConstantFromClass(env, audioManagerClass, + JAVA_AUDIOMANAGER_CLASS_NAME, JAVA_CONST_STREAM_RING_NAME, &(javaAudioTrackFields.STREAM_RING)) || !android_media_getIntConstantFromClass(env, audioManagerClass, - JAVA_AUDIOMANAGER_CLASS_NAME, + JAVA_AUDIOMANAGER_CLASS_NAME, JAVA_CONST_STREAM_ALARM_NAME, &(javaAudioTrackFields.STREAM_ALARM)) || !android_media_getIntConstantFromClass(env, audioManagerClass, - JAVA_AUDIOMANAGER_CLASS_NAME, - JAVA_CONST_STREAM_NOTIFICATION_NAME, &(javaAudioTrackFields.STREAM_NOTIFICATION)) ) { + JAVA_AUDIOMANAGER_CLASS_NAME, + JAVA_CONST_STREAM_NOTIFICATION_NAME, &(javaAudioTrackFields.STREAM_NOTIFICATION)) + || !android_media_getIntConstantFromClass(env, audioManagerClass, + JAVA_AUDIOMANAGER_CLASS_NAME, + JAVA_CONST_STREAM_BLUETOOTH_SCO_NAME, + &(javaAudioTrackFields.STREAM_BLUETOOTH_SCO))) { // error log performed in android_media_getIntConstantFromClass() return -1; } - + return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods)); } diff --git a/core/jni/android_media_JetPlayer.cpp b/core/jni/android_media_JetPlayer.cpp index 994f161..fe60943 100644 --- a/core/jni/android_media_JetPlayer.cpp +++ b/core/jni/android_media_JetPlayer.cpp @@ -127,7 +127,7 @@ android_media_JetPlayer_release(JNIEnv *env, jobject thiz) // ---------------------------------------------------------------------------- static jboolean -android_media_JetPlayer_openFile(JNIEnv *env, jobject thiz, jstring path) +android_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path) { JetPlayer *lpJet = (JetPlayer *)env->GetIntField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); @@ -139,7 +139,6 @@ android_media_JetPlayer_openFile(JNIEnv *env, jobject thiz, jstring path) // set up event callback function lpJet->setEventCallback(jetPlayerEventCallback); - const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory LOGE("android_media_JetPlayer_openFile(): aborting, out of memory"); @@ -148,7 +147,7 @@ android_media_JetPlayer_openFile(JNIEnv *env, jobject thiz, jstring path) } LOGV("android_media_JetPlayer_openFile(): trying to open %s", pathStr ); - EAS_RESULT result = lpJet->openFile(pathStr); + EAS_RESULT result = lpJet->loadFromFile(pathStr); env->ReleaseStringUTFChars(path, pathStr); if(result==EAS_SUCCESS) { @@ -164,7 +163,8 @@ android_media_JetPlayer_openFile(JNIEnv *env, jobject thiz, jstring path) // ---------------------------------------------------------------------------- static jboolean -android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz) +android_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz, + jobject fileDescriptor, jlong offset, jlong length) { JetPlayer *lpJet = (JetPlayer *)env->GetIntField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); @@ -173,6 +173,35 @@ android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz) "Unable to retrieve JetPlayer pointer for openFile()"); } + // set up event callback function + lpJet->setEventCallback(jetPlayerEventCallback); + + LOGV("android_media_JetPlayer_openFileDescr(): trying to load JET file through its fd" ); + EAS_RESULT result = lpJet->loadFromFD(getParcelFileDescriptorFD(env, fileDescriptor), + (long long)offset, (long long)length); // cast params to types used by EAS_FILE + + if(result==EAS_SUCCESS) { + LOGV("android_media_JetPlayer_openFileDescr(): file successfully opened"); + return JNI_TRUE; + } else { + LOGE("android_media_JetPlayer_openFileDescr(): failed to open file with EAS error %d", + (int)result); + return JNI_FALSE; + } +} + + +// ---------------------------------------------------------------------------- +static jboolean +android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz) +{ + JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + thiz, javaJetPlayerFields.nativePlayerInJavaObj); + if (lpJet == NULL ) { + jniThrowException(env, "java/lang/IllegalStateException", + "Unable to retrieve JetPlayer pointer for closeFile()"); + } + if( lpJet->closeFile()==EAS_SUCCESS) { //LOGV("android_media_JetPlayer_closeFile(): file successfully closed"); return JNI_TRUE; @@ -191,7 +220,7 @@ android_media_JetPlayer_play(JNIEnv *env, jobject thiz) thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for play()"); } EAS_RESULT result = lpJet->play(); @@ -214,7 +243,7 @@ android_media_JetPlayer_pause(JNIEnv *env, jobject thiz) thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for pause()"); } EAS_RESULT result = lpJet->pause(); @@ -243,7 +272,7 @@ android_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz, thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for queueSegment()"); } EAS_RESULT result @@ -269,7 +298,7 @@ android_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz, thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for queueSegmentMuteArray()"); } EAS_RESULT result=EAS_FAILURE; @@ -314,7 +343,7 @@ android_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz, thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for setMuteFlags()"); } EAS_RESULT result; @@ -338,7 +367,7 @@ android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz, thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for setMuteArray()"); } EAS_RESULT result=EAS_FAILURE; @@ -367,7 +396,8 @@ android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz, //LOGV("android_media_JetPlayer_setMuteArray(): mute flags successfully updated"); return JNI_TRUE; } else { - LOGE("android_media_JetPlayer_setMuteArray(): failed to update mute flags with EAS error code %ld", result); + LOGE("android_media_JetPlayer_setMuteArray(): \ + failed to update mute flags with EAS error code %ld", result); return JNI_FALSE; } } @@ -382,7 +412,7 @@ android_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz, thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for setMuteFlag()"); } EAS_RESULT result; @@ -407,7 +437,7 @@ android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId) thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve JetPlayer pointer for openFile()"); + "Unable to retrieve JetPlayer pointer for triggerClip()"); } EAS_RESULT result; @@ -424,13 +454,39 @@ android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId) // ---------------------------------------------------------------------------- +static jboolean +android_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz) +{ + JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + thiz, javaJetPlayerFields.nativePlayerInJavaObj); + if (lpJet == NULL ) { + jniThrowException(env, "java/lang/IllegalStateException", + "Unable to retrieve JetPlayer pointer for clearQueue()"); + } + + EAS_RESULT result = lpJet->clearQueue(); + if(result==EAS_SUCCESS) { + //LOGV("android_media_JetPlayer_clearQueue(): clearQueue successful"); + return JNI_TRUE; + } else { + LOGE("android_media_JetPlayer_clearQueue(): clearQueue failed with EAS error code %ld", + result); + return JNI_FALSE; + } +} + + +// ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { // name, signature, funcPtr {"native_setup", "(Ljava/lang/Object;II)Z", (void *)android_media_JetPlayer_setup}, {"native_finalize", "()V", (void *)android_media_JetPlayer_finalize}, {"native_release", "()V", (void *)android_media_JetPlayer_release}, - {"native_openJetFile", "(Ljava/lang/String;)Z", (void *)android_media_JetPlayer_openFile}, + {"native_loadJetFromFile", + "(Ljava/lang/String;)Z", (void *)android_media_JetPlayer_loadFromFile}, + {"native_loadJetFromFileD", "(Ljava/io/FileDescriptor;JJ)Z", + (void *)android_media_JetPlayer_loadFromFileD}, {"native_closeJetFile","()Z", (void *)android_media_JetPlayer_closeFile}, {"native_playJet", "()Z", (void *)android_media_JetPlayer_play}, {"native_pauseJet", "()Z", (void *)android_media_JetPlayer_pause}, @@ -442,6 +498,7 @@ static JNINativeMethod gMethods[] = { {"native_setMuteArray","([ZZ)Z", (void *)android_media_JetPlayer_setMuteArray}, {"native_setMuteFlag", "(IZZ)Z", (void *)android_media_JetPlayer_setMuteFlag}, {"native_triggerClip", "(I)Z", (void *)android_media_JetPlayer_triggerClip}, + {"native_clearQueue", "()Z", (void *)android_media_JetPlayer_clearQueue}, }; #define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj" diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp index 722b5b8..c98207a 100644 --- a/core/jni/android_net_wifi_Wifi.cpp +++ b/core/jni/android_net_wifi_Wifi.cpp @@ -287,6 +287,24 @@ static jboolean android_net_wifi_stopDriverCommand(JNIEnv* env, jobject clazz) return doBooleanCommand("DRIVER STOP", "OK"); } +static jboolean android_net_wifi_startPacketFiltering(JNIEnv* env, jobject clazz) +{ + return doBooleanCommand("DRIVER RXFILTER-ADD 0", "OK") + && doBooleanCommand("DRIVER RXFILTER-ADD 1", "OK") + && doBooleanCommand("DRIVER RXFILTER-START", "OK"); +} + +static jboolean android_net_wifi_stopPacketFiltering(JNIEnv* env, jobject clazz) +{ + jboolean result = doBooleanCommand("DRIVER RXFILTER-STOP", "OK"); + if (result) { + (void)doBooleanCommand("DRIVER RXFILTER-REMOVE 1", "OK"); + (void)doBooleanCommand("DRIVER RXFILTER-REMOVE 0", "OK"); + } + + return result; +} + static jint android_net_wifi_getRssiCommand(JNIEnv* env, jobject clazz) { char reply[256]; @@ -478,6 +496,8 @@ static JNINativeMethod gWifiMethods[] = { { "setScanModeCommand", "(Z)Z", (void*) android_net_wifi_setScanModeCommand }, { "startDriverCommand", "()Z", (void*) android_net_wifi_startDriverCommand }, { "stopDriverCommand", "()Z", (void*) android_net_wifi_stopDriverCommand }, + { "startPacketFiltering", "()Z", (void*) android_net_wifi_startPacketFiltering }, + { "stopPacketFiltering", "()Z", (void*) android_net_wifi_stopPacketFiltering }, { "setPowerModeCommand", "(I)Z", (void*) android_net_wifi_setPowerModeCommand }, { "setNumAllowedChannelsCommand", "(I)Z", (void*) android_net_wifi_setNumAllowedChannelsCommand }, { "getNumAllowedChannelsCommand", "()I", (void*) android_net_wifi_getNumAllowedChannelsCommand }, diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 6ba949c..a7a0428 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -88,93 +88,98 @@ static jlong android_os_Debug_getNativeHeapFreeSize(JNIEnv *env, jobject clazz) #endif } -static int read_mapinfo(FILE *fp, stats_t* stats) +static void read_mapinfo(FILE *fp, stats_t* stats) { char line[1024]; int len; - int skip; + bool skip, done = false; unsigned start = 0, size = 0, resident = 0, pss = 0; unsigned shared_clean = 0, shared_dirty = 0; unsigned private_clean = 0, private_dirty = 0; unsigned referenced = 0; + unsigned temp; int isNativeHeap; int isDalvikHeap; int isSqliteHeap; -again: - isNativeHeap = 0; - isDalvikHeap = 0; - isSqliteHeap = 0; - skip = 0; - - if(fgets(line, 1024, fp) == 0) return 0; + if(fgets(line, 1024, fp) == 0) return; + + while (!done) { + isNativeHeap = 0; + isDalvikHeap = 0; + isSqliteHeap = 0; + skip = false; - len = strlen(line); - if (len < 1) return 0; - line[--len] = 0; + len = strlen(line); + if (len < 1) return; + line[--len] = 0; - /* ignore guard pages */ - if (line[18] == '-') skip = 1; + /* ignore guard pages */ + if (len > 18 && line[18] == '-') skip = true; - start = strtoul(line, 0, 16); + start = strtoul(line, 0, 16); - if (len >= 50) { - if (!strcmp(line + 49, "[heap]")) { + if (strstr("[heap]", line)) { isNativeHeap = 1; - } else if (!strncmp(line + 49, "/dalvik-LinearAlloc", strlen("/dalvik-LinearAlloc"))) { + } else if (strstr("/dalvik-LinearAlloc", line)) { isDalvikHeap = 1; - } else if (!strncmp(line + 49, "/mspace/dalvik-heap", strlen("/mspace/dalvik-heap"))) { + } else if (strstr("/mspace/dalvik-heap", line)) { isDalvikHeap = 1; - } else if (!strncmp(line + 49, "/dalvik-heap-bitmap/", strlen("/dalvik-heap-bitmap/"))) { + } else if (strstr("/dalvik-heap-bitmap/", line)) { isDalvikHeap = 1; - } else if (!strncmp(line + 49, "/tmp/sqlite-heap", strlen("/tmp/sqlite-heap"))) { + } else if (strstr("/tmp/sqlite-heap", line)) { isSqliteHeap = 1; } - } - // TODO: This needs to be fixed to be less fragile. If the order of this file changes or a new - // line is add, this method will return without filling out any of the information. - - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Size: %d kB", &size) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Rss: %d kB", &resident) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Pss: %d kB", &pss) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Shared_Clean: %d kB", &shared_clean) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Shared_Dirty: %d kB", &shared_dirty) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Private_Clean: %d kB", &private_clean) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Private_Dirty: %d kB", &private_dirty) != 1) return 0; - if (fgets(line, 1024, fp) == 0) return 0; - if (sscanf(line, "Referenced: %d kB", &referenced) != 1) return 0; - - if (skip) { - goto again; - } + while (true) { + if (fgets(line, 1024, fp) == 0) { + done = true; + break; + } + + if (sscanf(line, "Size: %d kB", &temp) == 1) { + size = temp; + } else if (sscanf(line, "Rss: %d kB", &temp) == 1) { + resident = temp; + } else if (sscanf(line, "Pss: %d kB", &temp) == 1) { + pss = temp; + } else if (sscanf(line, "Shared_Clean: %d kB", &temp) == 1) { + shared_clean = temp; + } else if (sscanf(line, "Shared_Dirty: %d kB", &temp) == 1) { + shared_dirty = temp; + } else if (sscanf(line, "Private_Clean: %d kB", &temp) == 1) { + private_clean = temp; + } else if (sscanf(line, "Private_Dirty: %d kB", &temp) == 1) { + private_dirty = temp; + } else if (sscanf(line, "Referenced: %d kB", &temp) == 1) { + referenced = temp; + } else if (strlen(line) > 40 && line[8] == '-' && line[17] == ' ') { + // looks like a new mapping + // example: "0000a000-00232000 rwxp 0000a000 00:00 0 [heap]" + break; + } + } - if (isNativeHeap) { - stats->nativePss += pss; - stats->nativePrivateDirty += private_dirty; - stats->nativeSharedDirty += shared_dirty; - } else if (isDalvikHeap) { - stats->dalvikPss += pss; - stats->dalvikPrivateDirty += private_dirty; - stats->dalvikSharedDirty += shared_dirty; - } else if (isSqliteHeap) { - // ignore - } else { - stats->otherPss += pss; - stats->otherPrivateDirty += shared_dirty; - stats->otherSharedDirty += private_dirty; + if (!skip) { + if (isNativeHeap) { + stats->nativePss += pss; + stats->nativePrivateDirty += private_dirty; + stats->nativeSharedDirty += shared_dirty; + } else if (isDalvikHeap) { + stats->dalvikPss += pss; + stats->dalvikPrivateDirty += private_dirty; + stats->dalvikSharedDirty += shared_dirty; + } else if ( isSqliteHeap) { + // ignore + } else { + stats->otherPss += pss; + stats->otherPrivateDirty += shared_dirty; + stats->otherSharedDirty += private_dirty; + } + } } - - return 1; } static void load_maps(int pid, stats_t* stats) @@ -185,10 +190,8 @@ static void load_maps(int pid, stats_t* stats) sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); if (fp == 0) return; - - while (read_mapinfo(fp, stats) != 0) { - // Do nothing - } + + read_mapinfo(fp, stats); fclose(fp); } diff --git a/core/jni/android_os_NetStat.cpp b/core/jni/android_os_NetStat.cpp deleted file mode 100644 index 983f719..0000000 --- a/core/jni/android_os_NetStat.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* //device/libs/android_runtime/android_os_Wifi.cpp -** -** Copyright 2007, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#define LOG_TAG "NetStat" - -#include "jni.h" -#include <utils/misc.h> -#include <android_runtime/AndroidRuntime.h> -#include <utils/Log.h> - -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#if HAVE_ANDROID_OS -#include <utils/Atomic.h> -#endif - -namespace android { - -static jint android_os_netStatGetTxPkts(JNIEnv* env, jobject clazz) -{ - int ret = 0; - int fd = -1; - char input[50]; - - fd = open("/sys/class/net/rmnet0/statistics/tx_packets", O_RDONLY); - if (fd <= 0) { - fd = open("/sys/class/net/ppp0/statistics/tx_packets", O_RDONLY); - } - - if (fd > 0) { - int size = read(fd, input, 50); - if (size > 0) { - ret = atoi(input); - } - close(fd); - } - - return (jint)ret; -} - -static jint android_os_netStatGetRxPkts(JNIEnv* env, jobject clazz) -{ - int ret = 0; - int fd = -1; - char input[50]; - - fd = open("/sys/class/net/rmnet0/statistics/rx_packets", O_RDONLY); - if (fd <= 0) { - fd = open("/sys/class/net/ppp0/statistics/rx_packets", O_RDONLY); - } - - if (fd > 0) { - int size = read(fd, input, 50); - if (size > 0) { - ret = atoi(input); - } - close(fd); - } - - return (jint)ret; -} - -static jint android_os_netStatGetRxBytes(JNIEnv* env, jobject clazz) -{ - int ret = 0; - int fd = -1; - char input[50]; - - fd = open("/sys/class/net/rmnet0/statistics/rx_bytes", O_RDONLY); - if (fd <= 0) { - fd = open("/sys/class/net/ppp0/statistics/rx_bytes", O_RDONLY); - } - - if (fd > 0) { - int size = read(fd, input, 50); - if (size > 0) { - ret = atoi(input); - } - close(fd); - } - - return (jint)ret; -} - - -static jint android_os_netStatGetTxBytes(JNIEnv* env, jobject clazz) -{ - int ret = 0; - int fd = -1; - char input[50]; - - fd = open("/sys/class/net/rmnet0/statistics/tx_bytes", O_RDONLY); - if (fd <= 0) { - fd = open("/sys/class/net/ppp0/statistics/tx_bytes", O_RDONLY); - } - - if (fd > 0) { - int size = read(fd, input, 50); - if (size > 0) { - ret = atoi(input); - } - close(fd); - } - - return (jint)ret; -} - -// ---------------------------------------------------------------------------- - -/* - * JNI registration. - */ -static JNINativeMethod gMethods[] = { - /* name, signature, funcPtr */ - - { "netStatGetTxPkts", "()I", - (void*) android_os_netStatGetTxPkts }, - - { "netStatGetRxPkts", "()I", - (void*) android_os_netStatGetRxPkts }, - - { "netStatGetTxBytes", "()I", - (void*) android_os_netStatGetTxBytes }, - - { "netStatGetRxBytes", "()I", - (void*) android_os_netStatGetRxBytes }, - -}; - -int register_android_os_NetStat(JNIEnv* env) -{ - jclass netStat = env->FindClass("android/os/NetStat"); - LOG_FATAL_IF(netStat == NULL, "Unable to find class android/os/NetStat"); - - return AndroidRuntime::registerNativeMethods(env, - "android/os/NetStat", gMethods, NELEM(gMethods)); -} - -}; // namespace android - diff --git a/core/jni/android_server_BluetoothDeviceService.cpp b/core/jni/android_server_BluetoothDeviceService.cpp index 61a4a26..0936310 100644 --- a/core/jni/android_server_BluetoothDeviceService.cpp +++ b/core/jni/android_server_BluetoothDeviceService.cpp @@ -428,36 +428,6 @@ static void disconnectRemoteDeviceNative(JNIEnv *env, jobject object, jstring ad #endif } -static jboolean isConnectableNative(JNIEnv *env, jobject object) { -#ifdef HAVE_BLUETOOTH - LOGV(__FUNCTION__); - native_data_t *nat = get_native_data(env, object); - if (nat) { - DBusMessage *reply = - dbus_func_args(env, nat->conn, nat->adapter, - DBUS_CLASS_NAME, "IsConnectable", - DBUS_TYPE_INVALID); - return reply ? dbus_returns_boolean(env, reply) : JNI_FALSE; - } -#endif - return JNI_FALSE; -} - -static jboolean isDiscoverableNative(JNIEnv *env, jobject object) { -#ifdef HAVE_BLUETOOTH - LOGV(__FUNCTION__); - native_data_t *nat = get_native_data(env, object); - if (nat) { - DBusMessage *reply = - dbus_func_args(env, nat->conn, nat->adapter, - DBUS_CLASS_NAME, "IsDiscoverable", - DBUS_TYPE_INVALID); - return reply ? dbus_returns_boolean(env, reply) : JNI_FALSE; - } -#endif - return JNI_FALSE; -} - static jstring getModeNative(JNIEnv *env, jobject object) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); @@ -495,26 +465,6 @@ static jboolean setModeNative(JNIEnv *env, jobject object, jstring mode) { return JNI_FALSE; } -static void common_Bonding(JNIEnv *env, jobject object, int timeout_ms, - const char *func, jstring address) { -#ifdef HAVE_BLUETOOTH - native_data_t *nat = get_native_data(env, object); - if (nat) { - const char *c_address = env->GetStringUTFChars(address, NULL); - LOGV("... address = %s", c_address); - DBusMessage *reply = - dbus_func_args_timeout(env, nat->conn, timeout_ms, nat->adapter, - DBUS_CLASS_NAME, func, - DBUS_TYPE_STRING, &c_address, - DBUS_TYPE_INVALID); - env->ReleaseStringUTFChars(address, c_address); - if (reply) { - dbus_message_unref(reply); - } - } -#endif -} - static jboolean createBondingNative(JNIEnv *env, jobject object, jstring address, jint timeout_ms) { LOGV(__FUNCTION__); @@ -540,15 +490,49 @@ static jboolean createBondingNative(JNIEnv *env, jobject object, return JNI_FALSE; } -static void cancelBondingProcessNative(JNIEnv *env, jobject object, +static jboolean cancelBondingProcessNative(JNIEnv *env, jobject object, jstring address) { LOGV(__FUNCTION__); - common_Bonding(env, object, -1, "CancelBondingProcess", address); +#ifdef HAVE_BLUETOOTH + native_data_t *nat = get_native_data(env, object); + if (nat) { + const char *c_address = env->GetStringUTFChars(address, NULL); + LOGV("... address = %s", c_address); + DBusMessage *reply = + dbus_func_args_timeout(env, nat->conn, -1, nat->adapter, + DBUS_CLASS_NAME, "CancelBondingProcess", + DBUS_TYPE_STRING, &c_address, + DBUS_TYPE_INVALID); + env->ReleaseStringUTFChars(address, c_address); + if (reply) { + dbus_message_unref(reply); + } + return JNI_TRUE; + } +#endif + return JNI_FALSE; } -static void removeBondingNative(JNIEnv *env, jobject object, jstring address) { +static jboolean removeBondingNative(JNIEnv *env, jobject object, jstring address) { LOGV(__FUNCTION__); - common_Bonding(env, object, -1, "RemoveBonding", address); +#ifdef HAVE_BLUETOOTH + native_data_t *nat = get_native_data(env, object); + if (nat) { + const char *c_address = env->GetStringUTFChars(address, NULL); + LOGV("... address = %s", c_address); + DBusMessage *reply = + dbus_func_args_timeout(env, nat->conn, -1, nat->adapter, + DBUS_CLASS_NAME, "RemoveBonding", + DBUS_TYPE_STRING, &c_address, + DBUS_TYPE_INVALID); + env->ReleaseStringUTFChars(address, c_address); + if (reply) { + dbus_message_unref(reply); + } + return JNI_TRUE; + } +#endif + return JNI_FALSE; } static jobjectArray listBondingsNative(JNIEnv *env, jobject object) { @@ -660,14 +644,6 @@ static jboolean setNameNative(JNIEnv *env, jobject obj, jstring name) { return JNI_FALSE; } -static jstring getMajorClassNative(JNIEnv *env, jobject obj) { - return common_Get(env, obj, "GetMajorClass"); -} - -static jstring getMinorClassNative(JNIEnv *env, jobject obj) { - return common_Get(env, obj, "GetMinorClass"); -} - static jstring common_getRemote(JNIEnv *env, jobject object, const char *func, jstring address) { LOGV("%s:%s", __FUNCTION__, func); @@ -704,66 +680,6 @@ static jstring common_getRemote(JNIEnv *env, jobject object, const char *func, return NULL; } -static jstring getRemoteAliasNative(JNIEnv *env, jobject obj, jstring address) { - return common_getRemote(env, obj, "GetRemoteAlias", address); -} - -static jboolean setRemoteAliasNative(JNIEnv *env, jobject obj, - jstring address, jstring alias) { -#ifdef HAVE_BLUETOOTH - LOGV(__FUNCTION__); - native_data_t *nat = get_native_data(env, obj); - if (nat) { - const char *c_address = env->GetStringUTFChars(address, NULL); - const char *c_alias = env->GetStringUTFChars(alias, NULL); - - LOGV("... address = %s alias = %s", c_address, c_alias); - - DBusMessage *reply = dbus_func_args(env, nat->conn, nat->adapter, - DBUS_CLASS_NAME, "SetRemoteAlias", - DBUS_TYPE_STRING, &c_address, - DBUS_TYPE_STRING, &c_alias, - DBUS_TYPE_INVALID); - - env->ReleaseStringUTFChars(address, c_address); - env->ReleaseStringUTFChars(alias, c_alias); - if (reply) - { - dbus_message_unref(reply); - return JNI_TRUE; - } - return JNI_FALSE; - } -#endif - return JNI_FALSE; -} - -static jboolean clearRemoteAliasNative(JNIEnv *env, jobject obj, jstring address) { -#ifdef HAVE_BLUETOOTH - LOGV(__FUNCTION__); - native_data_t *nat = get_native_data(env, obj); - if (nat) { - const char *c_address = env->GetStringUTFChars(address, NULL); - - LOGV("... address = %s", c_address); - - DBusMessage *reply = dbus_func_args(env, nat->conn, nat->adapter, - DBUS_CLASS_NAME, "ClearRemoteAlias", - DBUS_TYPE_STRING, &c_address, - DBUS_TYPE_INVALID); - - env->ReleaseStringUTFChars(address, c_address); - if (reply) - { - dbus_message_unref(reply); - return JNI_TRUE; - } - return JNI_FALSE; - } -#endif - return JNI_FALSE; -} - static jstring getRemoteVersionNative(JNIEnv *env, jobject obj, jstring address) { return common_getRemote(env, obj, "GetRemoteVersion", address); } @@ -780,14 +696,6 @@ static jstring getRemoteCompanyNative(JNIEnv *env, jobject obj, jstring address) return common_getRemote(env, obj, "GetRemoteCompany", address); } -static jstring getRemoteMajorClassNative(JNIEnv *env, jobject obj, jstring address) { - return common_getRemote(env, obj, "GetRemoteMajorClass", address); -} - -static jstring getRemoteMinorClassNative(JNIEnv *env, jobject obj, jstring address) { - return common_getRemote(env, obj, "GetRemoteMinorClass", address); -} - static jstring getRemoteNameNative(JNIEnv *env, jobject obj, jstring address) { return common_getRemote(env, obj, "GetRemoteName", address); } @@ -800,28 +708,6 @@ static jstring lastUsedNative(JNIEnv *env, jobject obj, jstring address) { return common_getRemote(env, obj, "LastUsed", address); } -static jobjectArray getRemoteServiceClassesNative(JNIEnv *env, jobject object, - jstring address) { -#ifdef HAVE_BLUETOOTH - LOGV(__FUNCTION__); - native_data_t *nat = get_native_data(env, object); - if (nat) { - const char *c_address = env->GetStringUTFChars(address, NULL); - - LOGV("... address = %s", c_address); - - DBusMessage *reply = - dbus_func_args(env, nat->conn, nat->adapter, - DBUS_CLASS_NAME, "GetRemoteServiceClasses", - DBUS_TYPE_STRING, &c_address, - DBUS_TYPE_INVALID); - env->ReleaseStringUTFChars(address, c_address); - return reply ? dbus_returns_array_of_strings(env, reply) : NULL; - } -#endif - return NULL; -} - static jint getRemoteClassNative(JNIEnv *env, jobject object, jstring address) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); @@ -1070,8 +956,6 @@ static JNINativeMethod sMethods[] = { {"getAddressNative", "()Ljava/lang/String;", (void *)getAddressNative}, {"getNameNative", "()Ljava/lang/String;", (void*)getNameNative}, {"setNameNative", "(Ljava/lang/String;)Z", (void *)setNameNative}, - {"getMajorClassNative", "()Ljava/lang/String;", (void *)getMajorClassNative}, - {"getMinorClassNative", "()Ljava/lang/String;", (void *)getMinorClassNative}, {"getVersionNative", "()Ljava/lang/String;", (void *)getVersionNative}, {"getRevisionNative", "()Ljava/lang/String;", (void *)getRevisionNative}, {"getManufacturerNative", "()Ljava/lang/String;", (void *)getManufacturerNative}, @@ -1100,17 +984,11 @@ static JNINativeMethod sMethods[] = { {"removeBondingNative", "(Ljava/lang/String;)Z", (void *)removeBondingNative}, {"getRemoteNameNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteNameNative}, - {"getRemoteAliasNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteAliasNative}, - {"setRemoteAliasNative", "(Ljava/lang/String;Ljava/lang/String;)Z", (void *)setRemoteAliasNative}, - {"clearRemoteAliasNative", "(Ljava/lang/String;)Z", (void *)clearRemoteAliasNative}, {"getRemoteVersionNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteVersionNative}, {"getRemoteRevisionNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteRevisionNative}, {"getRemoteClassNative", "(Ljava/lang/String;)I", (void *)getRemoteClassNative}, {"getRemoteManufacturerNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteManufacturerNative}, {"getRemoteCompanyNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteCompanyNative}, - {"getRemoteMajorClassNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteMajorClassNative}, - {"getRemoteMinorClassNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)getRemoteMinorClassNative}, - {"getRemoteServiceClassesNative", "(Ljava/lang/String;)[Ljava/lang/String;", (void *)getRemoteServiceClassesNative}, {"getRemoteServiceChannelNative", "(Ljava/lang/String;S)Z", (void *)getRemoteServiceChannelNative}, {"getRemoteFeaturesNative", "(Ljava/lang/String;)[B", (void *)getRemoteFeaturesNative}, {"lastSeenNative", "(Ljava/lang/String;)Ljava/lang/String;", (void *)lastSeenNative}, diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp index 3468265..75a0fbe 100644 --- a/core/jni/android_server_BluetoothEventLoop.cpp +++ b/core/jni/android_server_BluetoothEventLoop.cpp @@ -47,8 +47,6 @@ static jmethodID method_onRemoteDeviceDisappeared; static jmethodID method_onRemoteClassUpdated; static jmethodID method_onRemoteNameUpdated; static jmethodID method_onRemoteNameFailed; -static jmethodID method_onRemoteAliasChanged; -static jmethodID method_onRemoteAliasCleared; static jmethodID method_onRemoteDeviceConnected; static jmethodID method_onRemoteDeviceDisconnectRequested; static jmethodID method_onRemoteDeviceDisconnected; @@ -60,6 +58,8 @@ static jmethodID method_onGetRemoteServiceChannelResult; static jmethodID method_onPasskeyAgentRequest; static jmethodID method_onPasskeyAgentCancel; +static jmethodID method_onAuthAgentAuthorize; +static jmethodID method_onAuthAgentCancel; typedef event_loop_native_data_t native_data_t; @@ -85,7 +85,6 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_onRemoteClassUpdated = env->GetMethodID(clazz, "onRemoteClassUpdated", "(Ljava/lang/String;I)V"); method_onRemoteNameUpdated = env->GetMethodID(clazz, "onRemoteNameUpdated", "(Ljava/lang/String;Ljava/lang/String;)V"); method_onRemoteNameFailed = env->GetMethodID(clazz, "onRemoteNameFailed", "(Ljava/lang/String;)V"); - method_onRemoteAliasChanged = env->GetMethodID(clazz, "onRemoteAliasChanged", "(Ljava/lang/String;Ljava/lang/String;)V"); method_onRemoteDeviceConnected = env->GetMethodID(clazz, "onRemoteDeviceConnected", "(Ljava/lang/String;)V"); method_onRemoteDeviceDisconnectRequested = env->GetMethodID(clazz, "onRemoteDeviceDisconnectRequested", "(Ljava/lang/String;)V"); method_onRemoteDeviceDisconnected = env->GetMethodID(clazz, "onRemoteDeviceDisconnected", "(Ljava/lang/String;)V"); @@ -96,6 +95,8 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_onPasskeyAgentRequest = env->GetMethodID(clazz, "onPasskeyAgentRequest", "(Ljava/lang/String;I)V"); method_onPasskeyAgentCancel = env->GetMethodID(clazz, "onPasskeyAgentCancel", "(Ljava/lang/String;)V"); + method_onAuthAgentAuthorize = env->GetMethodID(clazz, "onAuthAgentAuthorize", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); + method_onAuthAgentCancel = env->GetMethodID(clazz, "onAuthAgentCancel", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); method_onGetRemoteServiceChannelResult = env->GetMethodID(clazz, "onGetRemoteServiceChannelResult", "(Ljava/lang/String;I)V"); field_mNativeData = env->GetFieldID(clazz, "mNativeData", "I"); @@ -139,12 +140,12 @@ static void cleanupNativeDataNative(JNIEnv* env, jobject object) { #ifdef HAVE_BLUETOOTH static DBusHandlerResult event_filter(DBusConnection *conn, DBusMessage *msg, void *data); -static DBusHandlerResult passkey_agent_event_filter(DBusConnection *conn, - DBusMessage *msg, - void *data); +static DBusHandlerResult agent_event_filter(DBusConnection *conn, + DBusMessage *msg, + void *data); -static const DBusObjectPathVTable passkey_agent_vtable = { - NULL, passkey_agent_event_filter, NULL, NULL, NULL, NULL +static const DBusObjectPathVTable agent_vtable = { + NULL, agent_event_filter, NULL, NULL, NULL, NULL }; #endif @@ -193,9 +194,9 @@ static jboolean setUpEventLoopNative(JNIEnv *env, jobject object) { } // Add an object handler for passkey agent method calls - const char *path = "/android/bluetooth/PasskeyAgent"; + const char *path = "/android/bluetooth/Agent"; if (!dbus_connection_register_object_path(nat->conn, path, - &passkey_agent_vtable, NULL)) { + &agent_vtable, NULL)) { LOGE("%s: Can't register object path %s for agent!", __FUNCTION__, path); return JNI_FALSE; @@ -204,7 +205,7 @@ static jboolean setUpEventLoopNative(JNIEnv *env, jobject object) { // RegisterDefaultPasskeyAgent() will fail until hcid is up, so keep // trying for 10 seconds. int attempt; - for (attempt = 1000; attempt > 0; attempt--) { + for (attempt = 0; attempt < 1000; attempt++) { DBusMessage *reply = dbus_func_args_error(env, nat->conn, &err, BLUEZ_DBUS_BASE_PATH, "org.bluez.Security", "RegisterDefaultPasskeyAgent", @@ -213,7 +214,8 @@ static jboolean setUpEventLoopNative(JNIEnv *env, jobject object) { if (reply) { // Success dbus_message_unref(reply); - return JNI_TRUE; + LOGV("Registered agent on attempt %d of 1000\n", attempt); + break; } else if (dbus_error_has_name(&err, "org.freedesktop.DBus.Error.ServiceUnknown")) { // hcid is still down, retry @@ -225,9 +227,25 @@ static jboolean setUpEventLoopNative(JNIEnv *env, jobject object) { return JNI_FALSE; } } - LOGE("Time-out trying to call RegisterDefaultPasskeyAgent(), " - "is hcid running?"); - return JNI_FALSE; + if (attempt == 1000) { + LOGE("Time-out trying to call RegisterDefaultPasskeyAgent(), " + "is hcid running?"); + return JNI_FALSE; + } + + // Now register the Auth agent + DBusMessage *reply = dbus_func_args_error(env, nat->conn, &err, + BLUEZ_DBUS_BASE_PATH, + "org.bluez.Security", "RegisterDefaultAuthorizationAgent", + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + if (!reply) { + LOG_AND_FREE_DBUS_ERROR(&err); + return JNI_FALSE; + } + + dbus_message_unref(reply); + return JNI_TRUE; } #endif @@ -243,12 +261,19 @@ static void tearDownEventLoopNative(JNIEnv *env, jobject object) { DBusError err; dbus_error_init(&err); - const char *path = "/android/bluetooth/PasskeyAgent"; + const char *path = "/android/bluetooth/Agent"; DBusMessage *reply = dbus_func_args(env, nat->conn, BLUEZ_DBUS_BASE_PATH, - "org.bluez.Security", "UnregisterDefaultPasskeyAgent", - DBUS_TYPE_STRING, &path, - DBUS_TYPE_INVALID); + "org.bluez.Security", "UnregisterDefaultPasskeyAgent", + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); + if (reply) dbus_message_unref(reply); + + reply = + dbus_func_args(env, nat->conn, BLUEZ_DBUS_BASE_PATH, + "org.bluez.Security", "UnregisterDefaultAuthorizationAgent", + DBUS_TYPE_STRING, &path, + DBUS_TYPE_INVALID); if (reply) dbus_message_unref(reply); dbus_connection_unregister_object_path(nat->conn, path); @@ -395,34 +420,6 @@ static DBusHandlerResult event_filter(DBusConnection *conn, DBusMessage *msg, return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_signal(msg, "org.bluez.Adapter", - "RemoteAliasChanged")) { - char *c_address, *c_alias; - if (dbus_message_get_args(msg, &err, - DBUS_TYPE_STRING, &c_address, - DBUS_TYPE_STRING, &c_alias, - DBUS_TYPE_INVALID)) { - LOGV("... address = %s, alias = %s", c_address, c_alias); - env->CallVoidMethod(nat->me, - method_onRemoteAliasChanged, - env->NewStringUTF(c_address), - env->NewStringUTF(c_alias)); - } else LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, msg); - return DBUS_HANDLER_RESULT_HANDLED; - } else if (dbus_message_is_signal(msg, - "org.bluez.Adapter", - "RemoteAliasCleared")) { - char *c_address; - if (dbus_message_get_args(msg, &err, - DBUS_TYPE_STRING, &c_address, - DBUS_TYPE_INVALID)) { - LOGV("... address = %s", c_address); - env->CallVoidMethod(nat->me, - method_onRemoteAliasCleared, - env->NewStringUTF(c_address)); - } else LOG_AND_FREE_DBUS_ERROR_WITH_MSG(&err, msg); - return DBUS_HANDLER_RESULT_HANDLED; - } else if (dbus_message_is_signal(msg, - "org.bluez.Adapter", "RemoteDeviceConnected")) { char *c_address; if (dbus_message_get_args(msg, &err, @@ -518,9 +515,8 @@ static DBusHandlerResult event_filter(DBusConnection *conn, DBusMessage *msg, } // Called by dbus during WaitForAndDispatchEventNative() -static DBusHandlerResult passkey_agent_event_filter(DBusConnection *conn, - DBusMessage *msg, - void *data) { +static DBusHandlerResult agent_event_filter(DBusConnection *conn, + DBusMessage *msg, void *data) { native_data_t *nat = event_loop_nat; JNIEnv *env; @@ -573,11 +569,120 @@ static DBusHandlerResult passkey_agent_event_filter(DBusConnection *conn, env->CallVoidMethod(nat->me, method_onPasskeyAgentCancel, env->NewStringUTF(address)); + // reply + DBusMessage *reply = dbus_message_new_method_return(msg); + if (!reply) { + LOGE("%s: Cannot create message reply\n", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + dbus_connection_send(nat->conn, reply, NULL); + dbus_message_unref(reply); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(msg, "org.bluez.PasskeyAgent", "Release")) { - LOGE("We are no longer the passkey agent!"); + LOGW("We are no longer the passkey agent!"); + + // reply + DBusMessage *reply = dbus_message_new_method_return(msg); + if (!reply) { + LOGE("%s: Cannot create message reply\n", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + dbus_connection_send(nat->conn, reply, NULL); + dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, + "org.bluez.AuthorizationAgent", "Authorize")) { + const char *adapter; + const char *address; + const char *service; + const char *uuid; + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &adapter, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_STRING, &service, + DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_INVALID)) { + LOGE("%s: Invalid arguments for Authorize() method", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + LOGV("... address = %s", address); + LOGV("... service = %s", service); + LOGV("... uuid = %s", uuid); + + bool auth_granted = env->CallBooleanMethod(nat->me, + method_onAuthAgentAuthorize, env->NewStringUTF(address), + env->NewStringUTF(service), env->NewStringUTF(uuid)); + + // reply + if (auth_granted) { + DBusMessage *reply = dbus_message_new_method_return(msg); + if (!reply) { + LOGE("%s: Cannot create message reply\n", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + dbus_connection_send(nat->conn, reply, NULL); + dbus_message_unref(reply); + } else { + DBusMessage *reply = dbus_message_new_error(msg, + "org.bluez.Error.Rejected", "Authorization rejected"); + if (!reply) { + LOGE("%s: Cannot create message reply\n", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + dbus_connection_send(nat->conn, reply, NULL); + dbus_message_unref(reply); + } + return DBUS_HANDLER_RESULT_HANDLED; + } else if (dbus_message_is_method_call(msg, + "org.bluez.AuthorizationAgent", "Cancel")) { + const char *adapter; + const char *address; + const char *service; + const char *uuid; + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &adapter, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_STRING, &service, + DBUS_TYPE_STRING, &uuid, + DBUS_TYPE_INVALID)) { + LOGE("%s: Invalid arguments for Cancel() method", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + LOGV("... address = %s", address); + LOGV("... service = %s", service); + LOGV("... uuid = %s", uuid); + + env->CallVoidMethod(nat->me, + method_onAuthAgentCancel, env->NewStringUTF(address), + env->NewStringUTF(service), env->NewStringUTF(uuid)); + + // reply + DBusMessage *reply = dbus_message_new_method_return(msg); + if (!reply) { + LOGE("%s: Cannot create message reply\n", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + dbus_connection_send(nat->conn, reply, NULL); + dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; + + } else if (dbus_message_is_method_call(msg, + "org.bluez.AuthorizationAgent", "Release")) { + LOGW("We are no longer the auth agent!"); + + // reply + DBusMessage *reply = dbus_message_new_method_return(msg); + if (!reply) { + LOGE("%s: Cannot create message reply\n", __FUNCTION__); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + dbus_connection_send(nat->conn, reply, NULL); + dbus_message_unref(reply); + return DBUS_HANDLER_RESULT_HANDLED; } else { LOGV("... ignored"); } @@ -614,7 +719,8 @@ static jboolean waitForAndDispatchEventNative(JNIEnv *env, jobject object, #define BOND_RESULT_SUCCESS 0 #define BOND_RESULT_AUTH_FAILED 1 #define BOND_RESULT_AUTH_REJECTED 2 -#define BOND_RESULT_REMOTE_DEVICE_DOWN 3 +#define BOND_RESULT_AUTH_CANCELED 3 +#define BOND_RESULT_REMOTE_DEVICE_DOWN 4 void onCreateBondingResult(DBusMessage *msg, void *user) { LOGV(__FUNCTION__); @@ -637,7 +743,11 @@ void onCreateBondingResult(DBusMessage *msg, void *user) { // happens if either side presses 'cancel' at the pairing dialog. LOGV("... error = %s (%s)\n", err.name, err.message); result = BOND_RESULT_AUTH_REJECTED; - } else if (!strcmp(err.name, BLUEZ_DBUS_BASE_IFC ".ConnectionAttemptFailed")) { + } else if (!strcmp(err.name, BLUEZ_DBUS_BASE_IFC ".Error.AuthenticationCanceled")) { + // Not sure if this happens + LOGV("... error = %s (%s)\n", err.name, err.message); + result = BOND_RESULT_AUTH_CANCELED; + } else if (!strcmp(err.name, BLUEZ_DBUS_BASE_IFC ".Error.ConnectionAttemptFailed")) { // Other device is not responding at all LOGV("... error = %s (%s)\n", err.name, err.message); result = BOND_RESULT_REMOTE_DEVICE_DOWN; diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index add1080..d147bcc 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -44,6 +44,7 @@ static struct typedvalue_offsets_t jfieldID mAssetCookie; jfieldID mResourceId; jfieldID mChangingConfigurations; + jfieldID mDensity; } gTypedValueOffsets; static struct assetfiledescriptor_offsets_t @@ -83,7 +84,11 @@ enum { static jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table, const Res_value& value, uint32_t ref, ssize_t block, - uint32_t typeSpecFlags) + uint32_t typeSpecFlags, ResTable_config* config = NULL); + +jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table, + const Res_value& value, uint32_t ref, ssize_t block, + uint32_t typeSpecFlags, ResTable_config* config) { env->SetIntField(outValue, gTypedValueOffsets.mType, value.dataType); env->SetIntField(outValue, gTypedValueOffsets.mAssetCookie, @@ -93,6 +98,9 @@ static jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table, env->SetIntField(outValue, gTypedValueOffsets.mResourceId, ref); env->SetIntField(outValue, gTypedValueOffsets.mChangingConfigurations, typeSpecFlags); + if (config != NULL) { + env->SetIntField(outValue, gTypedValueOffsets.mDensity, config->density); + } return block; } @@ -703,13 +711,14 @@ static jint android_content_AssetManager_loadResourceValue(JNIEnv* env, jobject const ResTable& res(am->getResources()); Res_value value; + ResTable_config config; uint32_t typeSpecFlags; - ssize_t block = res.getResource(ident, &value, false, &typeSpecFlags); + ssize_t block = res.getResource(ident, &value, false, &typeSpecFlags, &config); uint32_t ref = ident; if (resolve) { block = res.resolveReference(&value, block, &ref); } - return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags) : block; + return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags, &config) : block; } static jint android_content_AssetManager_loadResourceBagValue(JNIEnv* env, jobject clazz, @@ -1648,6 +1657,8 @@ int register_android_content_AssetManager(JNIEnv* env) gTypedValueOffsets.mChangingConfigurations = env->GetFieldID(typedValue, "changingConfigurations", "I"); LOG_FATAL_IF(gTypedValueOffsets.mChangingConfigurations == NULL, "Unable to find TypedValue.changingConfigurations"); + gTypedValueOffsets.mDensity = env->GetFieldID(typedValue, "density", "I"); + LOG_FATAL_IF(gTypedValueOffsets.mDensity == NULL, "Unable to find TypedValue.density"); jclass assetFd = env->FindClass("android/content/res/AssetFileDescriptor"); LOG_FATAL_IF(assetFd == NULL, "Unable to find class android/content/res/AssetFileDescriptor"); diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp index 8bacc74..fbbd852 100644 --- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp +++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp @@ -18,7 +18,7 @@ #include <android_runtime/AndroidRuntime.h> #include <utils/misc.h> -#include <GLES/egl.h> +#include <EGL/egl.h> #include <GLES/gl.h> #include <ui/EGLNativeWindowSurface.h> diff --git a/core/jni/server/com_android_server_HardwareService.cpp b/core/jni/server/com_android_server_HardwareService.cpp index 224ab18..ac36348 100644 --- a/core/jni/server/com_android_server_HardwareService.cpp +++ b/core/jni/server/com_android_server_HardwareService.cpp @@ -28,21 +28,21 @@ namespace android { -static void on(JNIEnv *env, jobject clazz) +static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms) { - // LOGI("on\n"); - vibrator_on(); + // LOGI("vibratorOn\n"); + vibrator_on(timeout_ms); } -static void off(JNIEnv *env, jobject clazz) +static void vibratorOff(JNIEnv *env, jobject clazz) { - // LOGI("off\n"); + // LOGI("vibratorOff\n"); vibrator_off(); } static JNINativeMethod method_table[] = { - { "on", "()V", (void*)on }, - { "off", "()V", (void*)off } + { "vibratorOn", "(J)V", (void*)vibratorOn }, + { "vibratorOff", "()V", (void*)vibratorOff } }; int register_android_os_Vibrator(JNIEnv *env) diff --git a/core/jni/server/com_android_server_KeyInputQueue.cpp b/core/jni/server/com_android_server_KeyInputQueue.cpp index 4e9ffb1..63830d5 100644 --- a/core/jni/server/com_android_server_KeyInputQueue.cpp +++ b/core/jni/server/com_android_server_KeyInputQueue.cpp @@ -205,6 +205,25 @@ android_server_KeyInputQueue_getKeycodeStateDevice(JNIEnv* env, jobject clazz, return st; } +static jboolean +android_server_KeyInputQueue_hasKeys(JNIEnv* env, jobject clazz, + jintArray keyCodes, jbooleanArray outFlags) +{ + jboolean ret = JNI_FALSE; + + int32_t* codes = env->GetIntArrayElements(keyCodes, NULL); + uint8_t* flags = env->GetBooleanArrayElements(outFlags, NULL); + size_t numCodes = env->GetArrayLength(keyCodes); + if (numCodes == env->GetArrayLength(outFlags)) { + gLock.lock(); + if (gHub != NULL) ret = gHub->hasKeys(numCodes, codes, flags); + gLock.unlock(); + } + + env->ReleaseBooleanArrayElements(outFlags, flags, 0); + env->ReleaseIntArrayElements(keyCodes, codes, 0); + return ret; +} // ---------------------------------------------------------------------------- @@ -233,6 +252,8 @@ static JNINativeMethod gInputMethods[] = { (void*) android_server_KeyInputQueue_getKeycodeState }, { "getKeycodeState", "(II)I", (void*) android_server_KeyInputQueue_getKeycodeStateDevice }, + { "hasKeys", "([I[Z)Z", + (void*) android_server_KeyInputQueue_hasKeys }, }; int register_android_server_KeyInputQueue(JNIEnv* env) |