Jimmy, Jing Lv wrote: > Hi, > > As discussed in the former thread, I find that a JNI of DRLVM > (GetByteArrayRegion) differs from RI in passing parameter > (byte[count],count,0). RI (and J9 VM) returns immediately but DRLVM > throws an ArrayIndexOutOfBoundsException. > IMHO, it is better to improve here, make it follow RI, as JNI is > also a part of API, and users may use it. So if no objections, shall I > or someone raise a JIRA for this?
Go ahead and raise a JIRA Jimmy. Regards, Tim > I don't know if Martin is urgent in using Harmony in Winstone > servlet engine (Martin, can you read this?), so shall I work around in > java code before we have conclusion? > > Any comments/suggestions from DRLVM guys? Thanks! > > > Jimmy, Jing Lv wrote: >> Jimmy, Jing Lv wrote: >>> <snip> >>> >>> I do some further study and test then, and find the problem was not >>> so easy. >>> >>> Alex and I are correct that "offset <= buffer.length" here is wrong, >>> but the next "count <= buffer.length - offset" seems has proved its >>> correctness. >>> >>> I have a test[1], try to write(new byte[count],count, 0) to a >>> SocketOutputStream, the test passes quietly. I do this test on WinXp >>> Sp2, the latest Harmony workspace, with J9 VM5. >>> >>> I believe the ArrayIndexOutOfBoundsException is throw out when it try >>> to get byte array in the native (GetByteArrayRegion), which is a JNI >>> method. I guess there may be some difference between VMs. >>> >>> Martin, are you using DRLVM? Can someone using DRLVM (or other VMs) >>> run the test below on DRLVM for me? Thanks! >>> >>> [1] >>> public void test_socketOutputStream() throws Exception { >>> ServerSocket ss = new ServerSocket(0); >>> Socket sock = new Socket(); >>> sock.connect(new InetSocketAddress >>> (InetAddress.getLocalHost(),ss.getLocalPort())); >>> ss.accept(); >>> OutputStream os = sock.getOutputStream(); >>> os.write(new byte[0], 0, 0); // passes here >>> os.write(new byte[512], 512, 0); // passes here >>> } >>> >> >> Hi, >> >> At last I have test[1] JNI method(GetByteArrayRegion) of RI >> (before dinner, very hungry... :) ) >> The result is that, RI return successfully if the given offset >> equals length of the byte array, and the given count is zero. >> >> Thus IMHO it is better to improve DRLVM to follow RI, as JNI >> methods are also API methods, users may use it. >> >> Shall we raise a JIRA for DRLVM? Any comments/suggestions from >> DRLVM guys? Thanks! >> >> Time for dinner! :D >> >> [1] >> test.java >> -------------- >> class test >> { >> static{ >> System.loadLibrary("testjni"); >> } >> private native void testjni(byte[] bs); >> public void usejni(){ >> testjni(new byte[512]); >> } >> public static void main(String args[]){ >> new test().usejni(); >> } >> } >> --------------- >> test.h >> --------------- >> /* DO NOT EDIT THIS FILE - it is machine generated */ >> #include <jni.h> >> /* Header for class test */ >> >> #ifndef _Included_test >> #define _Included_test >> #ifdef __cplusplus >> extern "C" { >> #endif >> /* >> * Class: test >> * Method: testjni >> * Signature: ([B)V >> */ >> JNIEXPORT void JNICALL Java_test_testjni >> (JNIEnv *, jobject, jbyteArray); >> >> #ifdef __cplusplus >> } >> #endif >> #endif >> ------------------ >> test.c >> ------------------ >> #include "test.h" >> JNIEXPORT void JNICALL Java_test_testjni >> (JNIEnv * env, jobject obj,jbyteArray array){ >> jbyte* buf = (jbyte*)malloc(sizeof(jbyte)*512); >> (*env)->GetByteArrayRegion(env,array,512, 0, buf); >> } >> >> (magic number 512 can be any integer, including zero) >> >> <snip> > > -- Tim Ellison ([EMAIL PROTECTED]) IBM Java technology centre, UK. --------------------------------------------------------------------- Terms of use : http://incubator.apache.org/harmony/mailing.html To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]