On Tue, Sep 14, 2010 at 8:45 AM, Chun Tian (binghe) binghe.lisp@gmail.com wrote:
Hi again ... ABCL
I want to fill a Java byte[] array. But I don't know how to correctly use JARRAY-SET (I should use it, right?):
CL-USER(1): (defvar $*byte (jclass "byte")) $*BYTE CL-USER(2): (setf array (jnew-array $*byte 10)) #<jarray [B@7a2ee7e5 {1D7AAA0E}> CL-USER(3): (jarray-set array 1 0) #<THREAD "interpreter" {6E61A414}>: Debugger invoked on condition of type JAVA-EXCEPTION Java exception 'java.lang.IllegalArgumentException: argument type mismatch'. Restarts: 0: TOP-LEVEL Return to top level. [1] CL-USER(4): 0 CL-USER(5): (jarray-ref array 0) 0
So, a plain number "1" cannot work, but what else I can do? a object of java.lang.Byte?
You need to convert 1 to a Java byte... honestly I don't know if and how it can be done. Our fixnums are mapped to integers... we should probably extend jcoerce to handle numeric conversions as well. And conversion of numeric arrays, while we're at it.
And, is there any quick way I can fill a byte array using contents from a Lisp array?
The unexported system::%make-byte-array-output-stream and system::%get-output-stream-bytes come to my mind... but still you'll have to loop over the Lisp array. If there are no objections from other devs, I'd rather extend jcoerce to support your use case.
Cheers, Alessio
PS you can use (setf (jarray-ref array index) value) instead of jarray-set.