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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]