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]

Reply via email to