use 64-bits usage bits almost everywhere
this part fixes crashes due to how JNI uses variadic calls, so changing the return type of some methods will corrupt the stack silently on those calls Test: built, manual, cts as in b/38466700 Bug: 38466700 Bug: 33350696 Change-Id: I0e11cf0bb2fde2cf3a787e672c00d2dc0ccfb501
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "jni.h"
|
||||
#include "JNIHelp.h"
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "android_os_Parcel.h"
|
||||
#include "GraphicBuffer.h"
|
||||
@@ -27,6 +28,8 @@
|
||||
|
||||
#include <binder/Parcel.h>
|
||||
|
||||
#include <log/log.h>
|
||||
|
||||
#include <ui/GraphicBuffer.h>
|
||||
#include <ui/PixelFormat.h>
|
||||
|
||||
@@ -90,9 +93,15 @@ static struct {
|
||||
class GraphicBufferWrapper {
|
||||
public:
|
||||
explicit GraphicBufferWrapper(const sp<GraphicBuffer>& buffer): buffer(buffer) {
|
||||
LOG_ALWAYS_FATAL_IF(buffer == nullptr, "creating a null GraphicBuffer");
|
||||
}
|
||||
const sp<GraphicBuffer>& get() const {
|
||||
return buffer;
|
||||
}
|
||||
|
||||
sp<GraphicBuffer> buffer;
|
||||
private:
|
||||
// make sure this is immutable
|
||||
sp<GraphicBuffer> const buffer;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -102,6 +111,8 @@ public:
|
||||
static jlong android_graphics_GraphicBuffer_wrap(JNIEnv* env, jobject clazz,
|
||||
jlong unwrapped) {
|
||||
sp<GraphicBuffer> b(reinterpret_cast<GraphicBuffer*>(unwrapped));
|
||||
LOG_ALWAYS_FATAL_IF(b == nullptr,
|
||||
"*** android_graphics_GraphicBuffer_wrap() invalid state, b is null, unwrapped=%#" PRIx64, unwrapped);
|
||||
GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(b);
|
||||
return reinterpret_cast<jlong>(wrapper);
|
||||
}
|
||||
@@ -159,7 +170,7 @@ static jboolean android_graphics_GraphicBuffer_lockCanvas(JNIEnv* env, jobject,
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
sp<GraphicBuffer> buffer(wrapper->buffer);
|
||||
sp<GraphicBuffer> buffer(wrapper->get());
|
||||
|
||||
Rect rect(Rect::EMPTY_RECT);
|
||||
if (dirtyRect) {
|
||||
@@ -217,7 +228,7 @@ static jboolean android_graphics_GraphicBuffer_unlockCanvasAndPost(JNIEnv* env,
|
||||
nativeCanvas->setBitmap(SkBitmap());
|
||||
|
||||
if (wrapper) {
|
||||
status_t status = wrapper->buffer->unlock();
|
||||
status_t status = wrapper->get()->unlock();
|
||||
return status == 0 ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
@@ -230,11 +241,12 @@ static jboolean android_graphics_GraphicBuffer_unlockCanvasAndPost(JNIEnv* env,
|
||||
|
||||
static void android_graphics_GraphicBuffer_write(JNIEnv* env, jobject clazz,
|
||||
jlong wrapperHandle, jobject dest) {
|
||||
|
||||
GraphicBufferWrapper* wrapper =
|
||||
reinterpret_cast<GraphicBufferWrapper*>(wrapperHandle);
|
||||
Parcel* parcel = parcelForJavaObject(env, dest);
|
||||
if (parcel) {
|
||||
parcel->write(*wrapper->buffer);
|
||||
parcel->write(*wrapper->get());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -260,7 +272,7 @@ sp<GraphicBuffer> graphicBufferForJavaObject(JNIEnv* env, jobject obj) {
|
||||
jlong nativeObject = env->GetLongField(obj, gGraphicBufferClassInfo.mNativeObject);
|
||||
GraphicBufferWrapper* wrapper = (GraphicBufferWrapper*) nativeObject;
|
||||
if (wrapper != NULL) {
|
||||
sp<GraphicBuffer> buffer(wrapper->buffer);
|
||||
sp<GraphicBuffer> buffer(wrapper->get());
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
@@ -271,7 +283,7 @@ jobject createJavaGraphicBuffer(JNIEnv* env, const sp<GraphicBuffer>& buffer) {
|
||||
GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
|
||||
jobject obj = env->NewObject(gGraphicBufferClassInfo.mClass,
|
||||
gGraphicBufferClassInfo.mConstructorMethodID, buffer->getWidth(), buffer->getHeight(),
|
||||
buffer->getPixelFormat(), buffer->getUsage(), reinterpret_cast<jlong>(wrapper));
|
||||
buffer->getPixelFormat(), (jint)buffer->getUsage(), reinterpret_cast<jlong>(wrapper));
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
@@ -166,7 +166,7 @@ static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz,
|
||||
buffer->getWidth(),
|
||||
buffer->getHeight(),
|
||||
buffer->getPixelFormat(),
|
||||
buffer->getUsage(),
|
||||
(jint)buffer->getUsage(),
|
||||
(jlong)buffer.get());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user