summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-02-10 15:44:00 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-02-10 15:44:00 -0800
commitd24b8183b93e781080b2c16c487e60d51c12da31 (patch)
treefbb89154858984eb8e41556da7e9433040d55cd4 /core/jni
parentf1e484acb594a726fb57ad0ae4cfe902c7f35858 (diff)
downloadframeworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.zip
frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.tar.gz
frameworks_base-d24b8183b93e781080b2c16c487e60d51c12da31.tar.bz2
auto import from //branches/cupcake/...@130745
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/Android.mk4
-rw-r--r--core/jni/AndroidRuntime.cpp69
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp50
-rw-r--r--core/jni/android/graphics/Canvas.cpp36
-rw-r--r--core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp26
-rw-r--r--core/jni/android/graphics/Graphics.cpp11
-rw-r--r--core/jni/android/graphics/GraphicsJNI.h1
-rw-r--r--core/jni/android/graphics/NinePatch.cpp25
-rw-r--r--core/jni/android_hardware_Camera.cpp2
-rw-r--r--core/jni/android_media_AudioRecord.cpp10
-rw-r--r--core/jni/android_media_AudioSystem.cpp2
-rw-r--r--core/jni/android_media_AudioTrack.cpp107
-rw-r--r--core/jni/android_media_JetPlayer.cpp85
-rw-r--r--core/jni/android_net_wifi_Wifi.cpp20
-rw-r--r--core/jni/android_os_Debug.cpp133
-rw-r--r--core/jni/android_os_NetStat.cpp158
-rw-r--r--core/jni/android_server_BluetoothDeviceService.cpp198
-rw-r--r--core/jni/android_server_BluetoothEventLoop.cpp216
-rw-r--r--core/jni/android_util_AssetManager.cpp17
-rw-r--r--core/jni/com_google_android_gles_jni_EGLImpl.cpp2
-rw-r--r--core/jni/server/com_android_server_HardwareService.cpp14
-rw-r--r--core/jni/server/com_android_server_KeyInputQueue.cpp21
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, &region);
- 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)