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

Mark Evenson evenson at panix.com
Tue Sep 14 14:14:29 UTC 2010

On Sep 14, 2010, at 09:08 , Alessio Stalla wrote:

> 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.

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."

More information about the armedbear-devel mailing list