On Sep 14, 2010, at 09:08 , Alessio Stalla wrote:
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.
As Alessio probably well knows, you can produce a java byte for say "23" briefly as follows
(jcall (jmethod "java.lang.Byte" "byteValue") (jnew "java.lang.Byte" (format nil "~A" 23)))
but it returns as a Lisp integer before you can grab that reference.
Extending JCOERCE is probably the way to go here.
-- "A screaming comes across the sky. It has happened before, but there is nothing to compare to it now."