Index: gles2/android.fs ================================================================== --- gles2/android.fs +++ gles2/android.fs @@ -309,40 +309,61 @@ dup [: ." app cmd " . cr ;] $err endcase ; is acmd also jni +: android-characters ( string -- ) jstring>sstring unkeys jfree ; +: android-unicode ( uchar -- ) >xstring unkeys ; +: android-keycode ( keycode -- ) keycode>keys unkeys ; + : android-key ( event -- ) - >o getAction dup 2 = IF drop ." + >o getAction dup 2 = IF drop getKeyCode dup 0= IF - drop getCharacters jstring>sstring unkeys jfree + drop getCharacters android-characters ELSE - keycode>keys unkeys + android-keycode THEN ELSE 0= IF getUnicodeChar dup 0> - IF >xstring unkeys - ELSE drop getKeyCode keycode>keys unkeys + IF android-unicode + ELSE drop getKeyCode android-keycode THEN THEN - THEN o> ; + THEN o ]gref o> ; -Defer android-touch ( event -- ) -' drop IS android-touch +: android-touch ( event -- ) >o + me-getAction *input action ! + getFlags *input flags ! + getMetaState *input metastate ! + getEdgeFlags *input edgeflags ! + getPressure f>s *input pressure ! + getSize f>s *input size ! + getPointerCount dup *input tcount ! + *input x0 + 0 ?DO + I getY f>s + I getX f>s + rot dup >r 2! r> 2 cells + + LOOP drop + o ]gref o> ; -0 Value location -0 Value sensor +JValue location +JValue sensor Defer android-location ( location -- ) -:noname ." new location" cr to location ; IS android-location +:noname to location ; IS android-location Defer android-sensor ( sensor -- ) -:noname ." new sensor" cr to sensor ; IS android-sensor +:noname to sensor ; IS android-sensor :noname ( event type -- ) CASE - 0 OF android-key ENDOF - 1 OF android-touch ENDOF - 2 OF android-location ENDOF - 3 OF android-sensor ENDOF + 0 OF android-key ENDOF + 1 OF android-touch ENDOF + 2 OF android-location ENDOF + 3 OF android-sensor ENDOF + 4 OF android-characters ENDOF + 5 OF android-unicode ENDOF + 6 OF android-keycode ENDOF + 7 Of android-touch ENDOF nip ENDCASE ; is akey previous previous set-current Index: gles2/jni-helper.fs ================================================================== --- gles2/jni-helper.fs +++ gles2/jni-helper.fs @@ -47,15 +47,33 @@ jni-method: getKeyCode getKeyCode ()I jni-method: getCharacters getCharacters ()Ljava/lang/String; jni-method: getAction getAction ()I jni-method: isLongPress isLongPress ()Z +jni-class: android/view/MotionEvent +jni-method: getPointerCount getPointerCount ()I +jni-method: getX getX (I)F +jni-method: getY getY (I)F +jni-method: me-getAction getAction ()I +jni-method: getFlags getFlags ()I +jni-method: getEdgeFlags getEdgeFlags ()I +jni-method: getEventTime getEventTime ()J +jni-method: getMetaState getMetaState ()I +jni-method: getSize getSize (I)F +jni-method: getPressure getPressure (I)F + jni-class: java/util/List jni-method: l-get get (I)Ljava/lang/Object; jni-method: l-size size ()I +: l[] ( n list -- object ) >o l-get o> ; +: l# ( list -- n ) >o l-size o> ; + +: l-map ( xt list -- ) >o { xt } ( -- ) + l-size 0 ?DO I l-get >o xt execute ref> LOOP o> ; + : getUnicodeKey { event -- key } event AKeyEvent_getAction event AKeyEvent_getKeyCode newKeyEvent >o event AKeyEvent_getMetaState getUnicodeChar(I) o> ; Variable kbflag Index: gles2/jni-location.fs ================================================================== --- gles2/jni-location.fs +++ gles2/jni-location.fs @@ -88,26 +88,28 @@ jni-field: sensorManager sensorManager Landroid/hardware/SensorManager; also android : start-gps ( -- ) - clazz >o startgps gforth-handler >o post o> drop o> ; + clazz >o startgps gforth-handler >o post ref> drop o> ; : stop-gps ( -- ) - clazz >o stopgps gforth-handler >o post o> drop o> ; + clazz >o stopgps gforth-handler >o post ref> drop o> ; : start-sensor ( type delayus -- ) clazz >o argj0 2>r 0 to argj0 - sensorManager >o getDefaultSensor o> to argsensor - startsensor gforth-handler >o post o> drop + sensorManager >o getDefaultSensor dup ref> to argsensor ]ref + startsensor gforth-handler >o post ref> drop 2r> to argj0 o> ; -: stop-sensor ( -- ) - clazz >o stopsensor gforth-handler >o post o> drop o> ; +: stop-sensor ( type -- ) + clazz >o + sensorManager >o getDefaultSensor dup ref> to argsensor ]ref + stopsensor gforth-handler >o post ref> drop o> ; : .deg ( degree -- ) fdup f0< IF ." -" fnegate THEN fdup floor fdup f>s 0 .r '°' xemit f- 60e f* fdup floor fdup f>s 0 .r ''' xemit f- 60e f* @@ -114,10 +116,11 @@ f. ; : .location ( -- ) location >o o 0= IF ." unknown" cr ELSE + getProvider dup .jstring ]ref ." Lat: " getLatitude .deg cr ." Lon: " getLongitude .deg cr ." Alt: " getAltitude f. cr ." Spd: " getSpeed f. cr ." Dir: " getBearing f. cr @@ -127,9 +130,13 @@ o> ; : .sensor ( -- ) sensor >o o 0= IF ." unknown" ELSE + se-sensor >o getName .jstring space ref> se-values [f@ bounds DO I sf@ f. 1 sfloats +LOOP THEN cr o> ; + +: .sensors ( -- ) clazz >o sensorManager >o TYPE_ALL getSensorList >o + [: cr getType . getName .jstring ;] o l-map ref> ref> o> ; previous previous Index: gles2/jni-tools.fs ================================================================== --- gles2/jni-tools.fs +++ gles2/jni-tools.fs @@ -142,28 +142,60 @@ : l@' ( jclass jfid -- object ) fieldenv JNIEnv-GetStaticObjectField() ; Create 'sfield@ '[' 1+ 'A' [DO] "x@'" over [i] swap c! current @ search-wordlist 0= [IF] ' 2drop [THEN] , [LOOP] +\ global ref handling - you should ]gref every global ref after usage + +: ]ref ( object -- ) env tuck JNIEnv-DeleteLocalRef() ; +: ]gref ( object -- ) env tuck JNIEnv-DeleteGlobalRef() ; +: ref> ( object -- ) o ]ref r> o> >r ; +comp: drop ]] o ]ref o> [[ ; + +: gref! ( gref addr -- ) dup @ ?dup-IF ]gref THEN ! ; +: jvalue! ( gref xt -- ) >body gref! ; +comp: drop >body postpone ALiteral postpone gref! ; + +: JValue ( "name" -- ) 0 Value ['] jvalue! set-to ; + Variable cstring Variable cstring1 + +\ round robin store for four active jstrings + +JValue jstring0 +JValue jstring1 +JValue jstring2 +JValue jstring3 +Variable jstring# +: to-jstring ( value -- ) + 1 jstring# +! jstring# 3 and case + 0 of to jstring0 endof + 1 of to jstring1 endof + 2 of to jstring2 endof + 3 of to jstring3 endof + endcase ; : $0! ( addr u string -- addr' ) >r r@ $! 0 r@ $@ + c! r> $@ drop ; : cstr" ( -- addr ) parse-name cstring $0! ; : cstr1" ( -- addr ) parse-name cstring1 $0! ; -: make-jstring ( c-addr -- jstring-addr ) env tuck JNIEnv-NewStringUTF() ; +: make-jstring ( c-addr -- jstring-addr ) + env tuck JNIEnv-NewStringUTF() dup to-jstring ; : js" ( -- addr ) '"' parse cstring $0! make-jstring ; comp: drop '"' parse cstring $0! cstring>sstring 1+ ]] SLiteral drop make-jstring [[ ; Variable iscopy 2Variable to-release -: jstring>sstring ( string -- addr u ) +: jfree ( -- ) + to-release 2@ 2dup d0= IF 2drop EXIT THEN 0. to-release 2! + fieldenv JNIEnv-ReleaseStringUTFChars() ; +: jstring>sstring ( string -- addr u ) jfree dup >r iscopy fieldenv JNIEnv-GetStringUTFChars() r> over to-release 2! cstring>sstring ; -: jfree ( -- ) to-release 2@ fieldenv JNIEnv-ReleaseStringUTFChars() ; +: .jstring ( string -- ) jstring>sstring type jfree ; 0 Value jniclass "Java identifier not found" exception Constant !!javanf!! @@ -232,11 +264,10 @@ \ array access: you can access one array at a time Variable jnibuffer : [len ( array -- n ) env tuck JNIEnv-GetArrayLength() ; -: ]ref ( array -- ) env tuck JNIEnv-DeleteLocalRef() ; : >buffer ( size -- buffer ) jnibuffer $!len jnibuffer $@ drop ; : buffer@ ( -- addr u ) jnibuffer $@ ; : [z@ ( array -- addr n ) >r env r@ 0 r@ [len dup >buffer Index: jni-location.fs ================================================================== --- jni-location.fs +++ jni-location.fs @@ -88,26 +88,28 @@ jni-field: sensorManager sensorManager Landroid/hardware/SensorManager; also android : start-gps ( -- ) - clazz >o startgps gforth-handler >o post o> drop o> ; + clazz >o startgps gforth-handler >o post ref> drop o> ; : stop-gps ( -- ) - clazz >o stopgps gforth-handler >o post o> drop o> ; + clazz >o stopgps gforth-handler >o post ref> drop o> ; : start-sensor ( type delayus -- ) clazz >o argj0 2>r 0 to argj0 - sensorManager >o getDefaultSensor o> to argsensor - startsensor gforth-handler >o post o> drop + sensorManager >o getDefaultSensor dup ref> to argsensor ]ref + startsensor gforth-handler >o post ref> drop 2r> to argj0 o> ; -: stop-sensor ( -- ) - clazz >o stopsensor gforth-handler >o post o> drop o> ; +: stop-sensor ( type -- ) + clazz >o + sensorManager >o getDefaultSensor dup ref> to argsensor ]ref + stopsensor gforth-handler >o post ref> drop o> ; : .deg ( degree -- ) fdup f0< IF ." -" fnegate THEN fdup floor fdup f>s 0 .r '°' xemit f- 60e f* fdup floor fdup f>s 0 .r ''' xemit f- 60e f* @@ -114,10 +116,11 @@ f. ; : .location ( -- ) location >o o 0= IF ." unknown" cr ELSE + getProvider dup .jstring ]ref ." Lat: " getLatitude .deg cr ." Lon: " getLongitude .deg cr ." Alt: " getAltitude f. cr ." Spd: " getSpeed f. cr ." Dir: " getBearing f. cr @@ -127,9 +130,13 @@ o> ; : .sensor ( -- ) sensor >o o 0= IF ." unknown" ELSE + se-sensor >o getName .jstring space ref> se-values [f@ bounds DO I sf@ f. 1 sfloats +LOOP THEN cr o> ; + +: .sensors ( -- ) clazz >o sensorManager >o TYPE_ALL getSensorList >o + [: cr getType . getName .jstring ;] o l-map ref> ref> o> ; previous previous