harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jimmy, Jing Lv" <firep...@gmail.com>
Subject Re: Exceptions found while running servlet...
Date Thu, 10 Aug 2006 11:53:11 GMT
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