[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