harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jimmy, Jing Lv" <firep...@gmail.com>
Subject [DRLVM][JNI]GetByteArrayRegion differs from RI (was Re: Exceptions found while running servlet...)
Date Fri, 11 Aug 2006 02:36:06 GMT
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?

     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>


-- 

Best Regards!

Jimmy, Jing Lv
China Software Development Lab, IBM

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: harmony-dev-unsubscribe@incubator.apache.org
For additional commands, e-mail: harmony-dev-help@incubator.apache.org


Mime
View raw message