[armedbear-devel] How to use JARRAY-SET to fill a byte array?

Alessio Stalla alessiostalla at gmail.com
Tue Sep 14 07:08:55 UTC 2010

On Tue, Sep 14, 2010 at 8:45 AM, Chun Tian (binghe)
<binghe.lisp at 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 at 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.


PS you can use (setf (jarray-ref array index) value) instead of jarray-set.

More information about the armedbear-devel mailing list