Do less work in NewDirectByteBuffer.
There's no obvious reason to be duplicating Java code in C, and incurring
the cost of repeated crossings of the JNI boundary. Plus I want to
change/remove the Java code...
Bug: 2935622
Change-Id: I4eb25dd4b83cdbefaeed7593d3a5bbdb6cc06ced
diff --git a/vm/Globals.h b/vm/Globals.h
index 25a9d70..8d50676 100644
--- a/vm/Globals.h
+++ b/vm/Globals.h
@@ -325,7 +325,6 @@
/* assorted direct buffer helpers */
Method* methJavaNioReadWriteDirectByteBuffer_init;
- Method* methOrgApacheHarmonyLuniPlatformPlatformAddress_on;
Method* methOrgApacheHarmonyNioInternalDirectBuffer_getEffectiveAddress;
int offJavaNioBuffer_capacity;
int offJavaNioBuffer_effectiveDirectAddress;
diff --git a/vm/Jni.c b/vm/Jni.c
index 5fe68c0..498c866 100644
--- a/vm/Jni.c
+++ b/vm/Jni.c
@@ -342,10 +342,6 @@
* Look up and cache pointers to some direct buffer classes, fields,
* and methods.
*/
- ClassObject* platformAddressClass =
- dvmFindSystemClassNoInit("Lorg/apache/harmony/luni/platform/PlatformAddress;");
- ClassObject* platformAddressFactoryClass =
- dvmFindSystemClassNoInit("Lorg/apache/harmony/luni/platform/PlatformAddressFactory;");
ClassObject* directBufferClass =
dvmFindSystemClassNoInit("Lorg/apache/harmony/nio/internal/DirectBuffer;");
ClassObject* readWriteBufferClass =
@@ -353,8 +349,7 @@
ClassObject* bufferClass =
dvmFindSystemClassNoInit("Ljava/nio/Buffer;");
- if (platformAddressClass == NULL || platformAddressFactoryClass == NULL ||
- directBufferClass == NULL || readWriteBufferClass == NULL ||
+ if (directBufferClass == NULL || readWriteBufferClass == NULL ||
bufferClass == NULL)
{
LOGE("Unable to find internal direct buffer classes\n");
@@ -377,18 +372,9 @@
}
gDvm.methOrgApacheHarmonyNioInternalDirectBuffer_getEffectiveAddress = meth;
- meth = dvmFindDirectMethodByDescriptor(platformAddressFactoryClass,
- "on",
- "(I)Lorg/apache/harmony/luni/platform/PlatformAddress;");
- if (meth == NULL) {
- LOGE("Unable to find PlatformAddressFactory.on\n");
- return false;
- }
- gDvm.methOrgApacheHarmonyLuniPlatformPlatformAddress_on = meth;
-
meth = dvmFindDirectMethodByDescriptor(readWriteBufferClass,
"<init>",
- "(Lorg/apache/harmony/luni/platform/PlatformAddress;II)V");
+ "(II)V");
if (meth == NULL) {
LOGE("Unable to find ReadWriteDirectByteBuffer.<init>\n");
return false;
@@ -3621,37 +3607,19 @@
JNI_ENTER();
Thread* self = _self /*dvmThreadSelf()*/;
- Object* platformAddress = NULL;
JValue callResult;
jobject result = NULL;
- ClassObject* tmpClazz;
-
- tmpClazz = gDvm.methOrgApacheHarmonyLuniPlatformPlatformAddress_on->clazz;
- if (!dvmIsClassInitialized(tmpClazz) && !dvmInitClass(tmpClazz))
- goto bail;
-
- /* get an instance of PlatformAddress that wraps the provided address */
- dvmCallMethod(self,
- gDvm.methOrgApacheHarmonyLuniPlatformPlatformAddress_on,
- NULL, &callResult, address);
- if (dvmGetException(self) != NULL || callResult.l == NULL)
- goto bail;
-
- /* don't let the GC discard it */
- platformAddress = (Object*) callResult.l;
- dvmAddTrackedAlloc(platformAddress, self);
- LOGV("tracking %p for address=%p\n", platformAddress, address);
+ ClassObject* bufferClazz = gDvm.classJavaNioReadWriteDirectByteBuffer;
/* create an instance of java.nio.ReadWriteDirectByteBuffer */
- tmpClazz = gDvm.classJavaNioReadWriteDirectByteBuffer;
- if (!dvmIsClassInitialized(tmpClazz) && !dvmInitClass(tmpClazz))
+ if (!dvmIsClassInitialized(bufferClazz) && !dvmInitClass(bufferClazz))
goto bail;
- Object* newObj = dvmAllocObject(tmpClazz, ALLOC_DONT_TRACK);
+ Object* newObj = dvmAllocObject(bufferClazz, ALLOC_DONT_TRACK);
if (newObj != NULL) {
- /* call the (PlatformAddress, int, int) constructor */
+ /* call the constructor */
result = addLocalReference(env, newObj);
dvmCallMethod(self, gDvm.methJavaNioReadWriteDirectByteBuffer_init,
- newObj, &callResult, platformAddress, (jint) capacity, (jint) 0);
+ newObj, &callResult, (jint) address, (jint) capacity);
if (dvmGetException(self) != NULL) {
deleteLocalReference(env, result);
result = NULL;
@@ -3660,8 +3628,6 @@
}
bail:
- if (platformAddress != NULL)
- dvmReleaseTrackedAlloc(platformAddress, self);
JNI_EXIT();
return result;
}