Android

Antworten
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Android

Beitrag von mschnell »

Gibt es Bestrebungen, bei mseIDE eine Library Version zu schaffen, die bei Android über die Java API (wie nennt man die korrekt ?) "selber zeichnet" ?

-Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Android

Beitrag von mse »

Das wäre denkbar. Wie ist der Stand der FPC-Java Unterstützung? Meistens wenn ich etwas neues von FPC brauche ist es noch nicht so richtig fertig. ;-)
Implementiert werden müssten auf der Graphikseite:

Code: Alles auswählen

 
const
 gdifunctions: gdifunctionaty = (
   {$ifdef FPC}@{$endif}gdi_creategc,
   {$ifdef FPC}@{$endif}gdi_destroygc,
   {$ifdef FPC}@{$endif}gdi_changegc,
   {$ifdef FPC}@{$endif}gdi_createpixmap,
   {$ifdef FPC}@{$endif}gdi_pixmaptoimage,
   {$ifdef FPC}@{$endif}gdi_imagetopixmap,
   {$ifdef FPC}@{$endif}gdi_getcanvasclass,
   {$ifdef FPC}@{$endif}gdi_endpaint,
   {$ifdef FPC}@{$endif}gdi_flush,
   {$ifdef FPC}@{$endif}gdi_movewindowrect,
   {$ifdef FPC}@{$endif}gdi_drawlines,
   {$ifdef FPC}@{$endif}gdi_drawlinesegments,
   {$ifdef FPC}@{$endif}gdi_drawellipse,
   {$ifdef FPC}@{$endif}gdi_drawarc,
   {$ifdef FPC}@{$endif}gdi_fillrect,
   {$ifdef FPC}@{$endif}gdi_fillellipse,
   {$ifdef FPC}@{$endif}gdi_fillarc,
   {$ifdef FPC}@{$endif}gdi_fillpolygon,
   {$ifdef FPC}@{$endif}gdi_drawstring16,
   {$ifdef FPC}@{$endif}gdi_setcliporigin,
   {$ifdef FPC}@{$endif}gdi_createemptyregion,
   {$ifdef FPC}@{$endif}gdi_createrectregion,
   {$ifdef FPC}@{$endif}gdi_createrectsregion,
   {$ifdef FPC}@{$endif}gdi_destroyregion,
   {$ifdef FPC}@{$endif}gdi_copyregion,
   {$ifdef FPC}@{$endif}gdi_moveregion,
   {$ifdef FPC}@{$endif}gdi_regionisempty,
   {$ifdef FPC}@{$endif}gdi_regionclipbox,
   {$ifdef FPC}@{$endif}gdi_regsubrect,
   {$ifdef FPC}@{$endif}gdi_regsubregion,
   {$ifdef FPC}@{$endif}gdi_regaddrect,
   {$ifdef FPC}@{$endif}gdi_regaddregion,
   {$ifdef FPC}@{$endif}gdi_regintersectrect,
   {$ifdef FPC}@{$endif}gdi_regintersectregion,
   {$ifdef FPC}@{$endif}gdi_copyarea,
   {$ifdef FPC}@{$endif}gdi_getimage,
   {$ifdef FPC}@{$endif}gdi_fonthasglyph,
   {$ifdef FPC}@{$endif}gdi_getfont,
   {$ifdef FPC}@{$endif}gdi_getfonthighres,
   {$ifdef FPC}@{$endif}gdi_freefontdata,
   {$ifdef FPC}@{$endif}gdi_gettext16width,
   {$ifdef FPC}@{$endif}gdi_getchar16widths,
   {$ifdef FPC}@{$endif}gdi_getfontmetrics
);
 

Die Verbindung zum Betriebssystem:

Code: Alles auswählen

 
function gui_init: guierrorty;
function gui_deinit: guierrorty;
procedure gui_cancelshutdown;
procedure GUI_DEBUGBEGIN; export;
procedure GUI_DEBUGEND; export;
 
function gui_registergdi: guierrorty;
function gui_setmainthread: guierrorty; //set mainthread to currentthread
function gui_sethighrestimer(const avalue: boolean): guierrorty;
function gui_grouphideminimizedwindows: boolean; //true for win32
 
//application has to be locked for all following calls
function gui_postevent(event: tmseevent): guierrorty;
function gui_settimer(us: longword): guierrorty;
               //send et_timer event after delay of us (micro seconds)
 
function gui_hasevent: boolean;         //false if no event pending
function gui_getevent: tmseevent;          //can be nil
function gui_escapepressed: boolean;
procedure gui_resetescapepressed;
 
 
function gui_createwindow(const rect: rectty;
                               var options: internalwindowoptionsty;
                               var awindow: windowty): guierrorty;
function gui_destroywindow(var awindow: windowty): guierrorty;
                      //id can be 0
function gui_getparentwindow(const awindow: winidty): winidty;
function gui_reparentwindow(const child: winidty; const parent: winidty;
                            const pos: pointty): guierrorty;
function gui_getchildren(const id: winidty; out children: winidarty): guierrorty;
 
function gui_showsysdock(var awindow: windowty): guierrorty;
function gui_hidesysdock(var awindow: windowty): guierrorty;
 
function gui_docktosyswindow(var child: windowty;
                                   const akind: syswindowty): guierrorty;
                    //hides window
//function gui_undockfromsyswindow(var child: windowty): guierrorty;
                    //hides window
 
function gui_traymessage(var awindow: windowty; const message: msestring;
                          out messageid: longword;
                          const timeoutms: longword = 0): guierrorty;
function gui_canceltraymessage(var awindow: windowty;
                          const messageid: longword): guierrorty;
function gui_settrayicon(var awindow: windowty;
                                     const icon,mask: pixmapty): guierrorty;
function gui_settrayhint(var awindow: windowty;
                                     const hint: msestring): guierrorty;
 
//function gui_creategc(paintdevice: paintdevicety; const akind: gckindty;
//                var gc: gcty; const aprintername: msestring = ''): guierrorty;
//function gui_destroygc(winid: winidty; var gc: gcty): guierrorty;
function gui_flushgdi(const synchronize: boolean = false): guierrorty;
function gui_showwindow(id: winidty): guierrorty;
function gui_hidewindow(id: winidty): guierrorty;
function gui_raisewindow(id: winidty): guierrorty;
function gui_lowerwindow(id: winidty): guierrorty;
function gui_stackunderwindow(id: winidty; predecessor: winidty): guierrorty;
function gui_stackoverwindow(id: winidty; predecessor: winidty): guierrorty;
function gui_canstackunder: boolean; //no way found to change stacking order in KDE
function gui_getzorder(const ids: winidarty; out zorders: integerarty): guierrorty;
    //topevel -> highest, numbers have not to be contiguous
 
function gui_getwindowrect(id: winidty; out rect: rectty): guierrorty;
             //screen coordinates
function gui_getwindowpos(id: winidty; out pos: pointty): guierrorty;
             //parent window coordinates
function gui_getwindowsize(id: winidty): windowsizety;
function gui_getwindowdesktop(const id: winidty): integer;
function gui_windowvisible(id: winidty): boolean;
function gui_setwindowstate(id: winidty; size: windowsizety; visible: boolean): guierrorty;
function gui_setwindowcaption(id: winidty; const caption: msestring): guierrorty;
function gui_setwindowicon(id: winidty; const icon,mask: pixmapty): guierrorty;
 
function gui_setsizeconstraints(id: winidty; const min,max: sizety): guierrorty;
function gui_reposwindow(id: winidty; const rect: rectty): guierrorty;
function gui_getdecoratedwindowrect(id: winidty; out arect: rectty): guierrorty;
function gui_setdecoratedwindowrect(id: winidty; const rect: rectty;
                                    out clientrect: rectty): guierrorty;
function gui_setembeddedwindowrect(id: winidty; const rect: rectty): guierrorty;
function gui_setwindowfocus(id: winidty): guierrorty;
function gui_setimefocus(var awindow: windowty): guierrorty;
function gui_unsetimefocus(var awindow: windowty): guierrorty;
{
function gui_windowgetfocus(var awindow: windowty): guierrorty;
function gui_windowloosefocus(var awindow: windowty): guierrorty;
}

function gui_setappfocus(id: winidty): guierrorty;
function gui_minimizeapplication: guierrorty;
function gui_setwindowgroup(id: winidty; group: winidty): guierrorty;
function gui_settransientfor(var awindow: windowty;
                                  const transientfor: winidty): guierrorty;
function gui_movewindowrect(id: winidty; const dist: pointty;
                                         const rect: rectty): guierrorty;
function gui_windowatpos(const pos: pointty): winidty;
function gui_getscreenrect(const id: winidty): rectty; //0 -> virtual screen
function gui_getworkarea(id: winidty): rectty;
function gui_setapplicationicon(const icon,mask: pixmapty): guierrorty;
function gui_pidtowinid(const pids: procidarty): winidty;
 
function gui_setcursorshape(winid: winidty; shape: cursorshapety): guierrorty;
function gui_getpointerpos: pointty;
function gui_setpointerpos(const pos: pointty): guierrorty;
function gui_movepointer(const dist: pointty): guierrorty;
function gui_grabpointer(id: winidty): guierrorty;
function gui_ungrabpointer: guierrorty;
 
function gui_rgbtopixel(rgb: longword): pixelty;
function gui_pixeltorgb(pixel: pixelty): longword;
//function gui_rgbtocolormappixel(rgb: longword): pixelty;
              //neutralizes color in 8bit coler depth
function gui_initcolormap: guierrorty;
 
function gui_regiontorects(const aregion: regionty): rectarty;
//procedure gui_changegc(var drawinfo: drawinfoty; const values: gcvaluesty);
 
function gui_getdefaultfontnames: defaultfontnamesty;
 
function gui_createpixmap(const size: sizety; winid: winidty = 0;
      monochrome: boolean = false; copyfrom: pixmapty = 0): pixmapty; overload;
function gui_freepixmap(pixmap: pixmapty): gdierrorty;
function gui_getpixmapinfo(var info: pixmapinfoty): gdierrorty;
function gui_createbitmapfromdata(const size: sizety; datapo: pbyte;
             msbitfirst: boolean = false; dwordaligned: boolean = false;
             bottomup: boolean = false): pixmapty;
function gui_pixmaptoimage(pixmap: pixmapty; out image: imagety; gchandle: longword): gdierrorty;
                    //gchandle is used on win32 to select bitmap out of devicecontext,
                    //can be 0
function gui_imagetopixmap(const image: imagety; out pixmap: pixmapty; gchandle: longword): gdierrorty;
                    //gchandle is used on win32 to select bitmap out of devicecontext,
                    //can be 0
function gui_allocimagemem(length: integer): plongwordaty;
procedure gui_freeimagemem(data: plongwordaty);
 
//procedure gui_copyarea(var drawinfo: drawinfoty);
 
procedure gui_beep;
function gui_copytoclipboard(const value: msestring): guierrorty;
function gui_pastefromclipboard(out value: msestring): guierrorty;
function gui_canpastefromclipboard: boolean;
 
function gui_sysdnd(const action: sysdndactionty;
                     const aintf: isysdnd; const arect: rectty;
                               out aresult: boolean): guierrorty;
                               //aintf = nil for read actions
function gui_sysdndreaddata(var adata: string;
                              const typeindex: integer): guierrorty;
function gui_sysdndreadtext(var atext: msestring;
                              const typeindex: integer): guierrorty;
 
function gui_getgdifuncs: pgdifunctionaty;
 
function sys_getlasterror: integer;
procedure sys_setlasterror(const avalue: integer);
function sys_geterrortext(aerror: integer): string;
 
function sys_mutexcreate(out mutex: mutexty): syserrorty;
function sys_mutexdestroy(var mutex: mutexty): syserrorty;
function sys_mutexlock(var mutex: mutexty): syserrorty;
function sys_mutextrylock(var mutex: mutexty): syserrorty;
  //sye_ok if calling thread has lock, sye_busy if already locked by other thread
function sys_mutexunlock(var mutex: mutexty): syserrorty;
 
function sys_semcreate(out sem: semty; count: integer): syserrorty;
function sys_semdestroy(var sem: semty): syserrorty;
//function sys_semreset(var sem: semty): syserrorty; //call from single thread!
function sys_sempost(var sem: semty): syserrorty;
function sys_semwait(var sem: semty;  timeoutusec: integer): syserrorty;
          //timeoutusec <= 0 -> no timeout
          //sye_ok -> semaphore signaled
          //sye_timeout -> timeout
          //sye_semaphore -> error
function sys_semtrywait(var sem: semty): boolean;
function sys_semcount(var sem: semty): integer;
 
function sys_condcreate(out cond: condty): syserrorty;
function sys_conddestroy(var cond: condty): syserrorty;
function sys_condlock(var cond: condty): syserrorty;
function sys_condunlock(var cond: condty): syserrorty;
function sys_condsignal(var cond: condty): syserrorty;
function sys_condbroadcast(var cond: condty): syserrorty;
function sys_condwait(var cond: condty; timeoutusec: integer): syserrorty;
          //timeoutusec = 0 -> no timeout
          //sye_ok -> condition signaled
          //sye_timeout -> timeout
          //sye_cond -> error
 
function sys_utctolocaltime(const value: tdatetime): tdatetime;
function sys_localtimetoutc(const value: tdatetime): tdatetime;
 
function sys_gettimeus: longword;
               //systemtime in microseconds, origin undefined
function sys_getpid: procidty;
function sys_getprocesses: procitemarty;
function sys_terminateprocess(const proc: prochandlety): syserrorty;
function sys_killprocess(const proc: prochandlety): syserrorty;
 
function sys_threadcreate(var info: threadinfoty): syserrorty;
function sys_threadwaitfor(var info: threadinfoty): syserrorty;
function sys_threaddestroy(var info: threadinfoty): syserrorty;
function sys_threadschedyield: syserrorty;
function sys_getcurrentthread: threadty;
function sys_issamethread(const a,b: threadty): boolean;
function sys_getapplicationpath: filenamety;
function sys_getcommandlinearguments: stringarty;
function sys_getenv(const aname: msestring; out avalue: msestring): boolean;
                          //true if found
function sys_setenv(const aname: msestring;
                                const avalue: msestring): syserrorty;
function sys_unsetenv(const aname: msestring): syserrorty;
 
function sys_filesystemiscaseinsensitive: boolean;
function sys_tosysfilepath(var path: filenamety): syserrorty;
 
  //all filenames below are in mseformat!
function sys_getcurrentdir: filenamety;
function sys_getapphomedir: filenamety;
function sys_getuserhomedir: filenamety;
function sys_gettempdir: filenamety;
function sys_setcurrentdir(const dirname: filenamety): syserrorty;
function sys_copyfile(const oldfile,newfile: filenamety): syserrorty;
function sys_deletefile(const filename: filenamety): syserrorty;
function sys_renamefile(const oldname,newname: filenamety): syserrorty;
function sys_createdir(const path: msestring;
                  const rights: filerightsty): syserrorty;
 
function sys_openfile(const path: filenamety; const openmode: fileopenmodety;
          const accessmode: fileaccessmodesty;
          const rights: filerightsty; out handle: integer): syserrorty;
function sys_closefile(const handle: integer): syserrorty;
function sys_flushfile(const handle: integer): syserrorty;
function sys_dup(const source: integer; out dest: integer): syserrorty;
function sys_truncatefile(const handle: integer; const size: int64): syserrorty;
 
function sys_read(fd: longint; buf: pointer; nbytes: longword): integer;
function sys_write(fd: longint; buf: pointer; nbytes: longword): integer;
function sys_errorout(const atext: string): syserrorty;
function sys_stdin: integer;
function sys_stdout: integer;
function sys_stderr: integer;
 
function sys_getfileinfo(const path: filenamety; var info: fileinfoty): boolean;
function sys_opendirstream(var stream: dirstreamty): syserrorty;
function sys_closedirstream(var stream: dirstreamty): syserrorty;
function sys_readdirstream(var stream: dirstreamty; var info: fileinfoty): boolean;
 //true if valid
 
procedure sys_usleep(const us: longword);
procedure sys_schedyield;
 
function sys_getutctime: tdatetime;
function sys_getlocaltime: tdatetime;
function sys_localtimeoffset: tdatetime;
function sys_getlangname: string;
function sys_getprintcommand: string;
 
 

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Android

Beitrag von mschnell »

mse hat geschrieben:Meistens wenn ich etwas neues von FPC brauche ist es noch nicht so richtig fertig. ;-)

Ahh, deshalb ....
(Was wie sieht die "fpcJava-Unterstützung" denn überhaupt aus ? Kann ich mir im Moment nicht viel drunter vorstellen.)

-Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Android

Beitrag von mse »

mschnell hat geschrieben:(Was wie sieht die "fpcJava-Unterstützung" denn überhaupt aus ? Kann ich mir im Moment nicht viel drunter vorstellen.)

http://wiki.freepascal.org/FPC_JVM

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Android

Beitrag von mschnell »

"The FPC backend for the Java Virtual Machine (JVM) generates Java byte code". Das kenne ich (habe ich ja in der Diskussion schon erwähnt).

Was ich hier meinte, ist die Möglichkeit für ein natives ARM-Linux-Programm die Java-API von Android zu verwenden - sowohl für den Aufbau einer GUI als auch für die Verwendung von anderen Features des Systems. Also ein Übergang zwischen der nativen und der "virtual-Machine" Welt.

So etwas könnte beim neue "Delphi XE für Android" Firemonkey machen, um auf den Bildschirm zu malen. Oder wird da tatsächlich OpenGL ö.ä. verwendet, dass man ja dann erstmal installieren müsste, um ein Delphi-Programm laufen zu lassen.

-Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Android

Beitrag von mse »

Ich weiss nicht viel von diesen Dingen, vielleicht kann Christian mehr darüber sagen.
AFAIK gibt es für Android ein C-API:
http://developer.android.com/tools/sdk/ndk/index.html
Sonst werden wohl interface units in Dalvik-Code notwendig, wie man die mit standard FPC code linkt weiss ich nicht.

Android bietet OpenGL ES:
http://developer.android.com/guide/topics/graphics/opengl.html

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Android

Beitrag von Christian »

Delphi macht das tatsächlich so, also übers NDK auf den Bildschirm malen.
Wollen tut man das untr Android aber nicht weil man dann für jede Plattform kompilieren will. Da ist man mit dem Jave-Bytecode fpc besser dran (meine Meinung)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Android

Beitrag von mschnell »

Christian hat geschrieben:Wollen tut man das untr Android aber nicht weil man dann für jede Plattform kompilieren will. Da ist man mit dem Jave-Bytecode fpc besser dran (meine Meinung)


Klar ist es nett, dass "Dalvik" die Abhängigkeit von CPU und Betriebssystem verdeckt.
Aber gibt es tatsächlich ernsthaft relevante praktische Anwendung für Android auf anderen Plattformen als ARM/Linux ?

Das Argument (in der NDK-Beschreibung) scheint mir eher politisch zu sein.

Mit Delphi kann man (theoretisch) sein (Firemonkey) Projekt sowohl für Desktop-Windows als auch für iOS als auch für Android übedrsetzen.

Bei Lazarus kommt dann (hoffentlich, eines Tages) noch Desktop - Linux auf verschiedenen CPUs, MAC Windows Phone und etliches andere dazu.

-Michael

Antworten