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]