ãŸãããã¡ããšããã¢ãŒããã¯ãã£ãšåŒ·åãªåä»ããåããé«çŽèšèªã倧奜ãã§ãã ç§ã®ãæ°ã«å ¥ãã¯JavaãšCïŒã§ãã ã©ã¡ãããéçºè ã«C ++ãšæ¯èŒããŠå€ãã®å©ç¹ãæäŸããå€ãã®å¿é ã軜æžããŸãã è²»çšã¯ãããã§ããïŒ Oracle JVMã.NETãŸãã¯monoãšåŒã°ããéãããããéã¶ããšã«ããã 3ã€ã®ããããã¹ãŠã®éãã¯æ°çŸã¡ã¬ãã€ãã§ãããã©ã€ã»ã³ã¹ã¯åãŠãŒã¶ãŒãèªåã®ã³ã³ãã¥ãŒã¿ãŒã®å®¹éãæ··ä¹±ãããããšãªããã®ãã®ãããŠã³ããŒãããããšãäœåãªããããã»ã©ã®ãã®ã§ãããæãéèŠãªããšã«ã¯ãJavaããã°ã©ã ã¯JVMã®ãã¹ãŠã®ããŒãžã§ã³ãšäžåºŠã«äºææ§ããããŸãããïŒ ãããŠä»-ç§ãã¡ã¯ãå人ïŒãŸãã¯æ°çŸäžäººã®å人ïŒã«ããã°ã©ã ãæããŠãããã圌ãšäžç·ã«éå§ããªãããšãæ°ã«ããªãã ãã§ã¯ããŸããããªããšããäºå®ã«æ¥ãŸãã ç§ã¯ããªãããŒãªã»ããã¢ãããè¡ããæŸèæãé転ããªããã°ãªããã.NETã«ã€ããŠã¯ãŸã èšåããŠããŸãã-äžåºŠå人ã«3ã€ã®ã€ã³ã¹ããŒã«ãããããŒãžã§ã³ãäžåºŠèŠãŠã3ã€ãã¹ãŠãç°ãªãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠã§ãã...
ãããŠïŒ Javaã§ããã°ã©ã ãäœæããŸãããããã ãããã·ã³ã«JVMãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸããããã®ãããWindowsãLinuxãããã³OS Xã§ã¯ã³ã¿ããã§ãã«ãã§ããåæã«å°ãæéãããããŸãã 誰ããããCã§æžãããŠããªãããšãç解ããŠããªãããã«ã ãŸã£ããéã§ãïŒ ïŒãããç§ã¯gcjãæå³ããããã§ã¯ãããŸãããgcjã¯Javaã®ãã¹ãŠã®é åã奪ããŸãããªãã¬ã¯ã·ã§ã³ã¯åäœãããµãŒãããŒãã£ã®jarã§ããå®è¡ã§ããŸãïŒã

ãã¡ãããç§ã¯ãŠã£ã¶ãŒãã§ã¯ãããŸããã éæ³ã®ã¢ãŒãã£ãã¡ã¯ãã1ã€èŠã€ããŸããã ããã¯oss.readytalk.com/avianã«ããAvianãšåŒã°ãã軜éã§ãããªããæ¬æ ŒçãªãµãŒãããŒãã£JVMå®è£ ã§ãããOracleã«ã¯èããããšããªããããããŸããã å€æ°ã®ãã©ãããã©ãŒã ãšã¢ãŒããã¯ãã£ããµããŒãããã奜ããªããšãããŠããããããã©ã€ã»ã³ã¹ããããŸã-ããããç§ã¯ãã®ãããžã§ã¯ããšã¯äœã®é¢ä¿ããããŸãããç§ã¯è²¢ç®è ã§ããªããããã䜿çšããæ¹æ³ãåŠã³ãå°æ¬ããŠãã®åŒ·åãªç¥èãå ±æãããã§ãããã«ã®äœæ°ã ãŸããJITã³ã³ãã€ã©ãŒã§ããããšã«æ³šæããŠãã ãããã€ãŸãã競äºåã®ããé«ãããã©ãŒãã³ã¹ãåããŠããŸãïŒãŸã 枬å®ããŠããŸããïŒã
Avianã¯ãéåžžã«çŽ°ããæ©èœçãªã¯ã©ã¹ã©ã€ãã©ãªæšæºãšãšãã«ã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãããšãã§ããããã°ã©ã ã¯ããã¯ä»ãã®ã¡ã¬ãã€ãã®ã¿ã§ãããéãããã®ã«ãªããŸãã ãã®ãããªããã°ã©ã ããŸãšããŸãããã
0.æ°Žææ¥
ãã«ãããã«ã¯ãæåã«unix-developerã³ãã³ãã©ã€ã³ãŠãŒãã£ãªãã£ãç¹ã«g ++ã³ã³ãã€ã©ãå¿ èŠã§ãã WindowsãŠãŒã¶ãŒã«ãšã£ãŠæãé£ããããšã Unix端æ«ããšãã¥ã¬ãŒãããçŽ æŽãããMSYSç°å¢ãåããWindowsã§MinGW32ã䜿çšããŠããŸããã MinGW32ã«å«ãŸããã³ã³ãã€ã©ã¯32ãããã§ãããäœããã®æ¹æ³ã§çµæã®ããã°ã©ã ãå¶éããŸãã ã³ã¡ã³ãã§ã圌ãã¯é·ãé䟿å©ãªmingw-w64ããããããã¯å®æçã«æŽæ°ãããMSYSã ãã§ãªãgitããããšç§ã«èšã£ãã
以éã䟿å®äžãã¹ãã€ã©ãŒã®äžã«ãã©ãããã©ãŒã åºæã®æ瀺ãé ããŸããã
çª
MinGWãããŠã³ããŒãããã«ã¯ã sourceforge.net / projects / mingwbuildsã«ã¢ã¯ã»ã¹ããŠã2ã€ã®ã¢ãŒã«ã€ããããŠã³ããŒãããŸãïŒx64- XXX -release-posix-seh-rev X .7zããã³external-binary-packages / msys + 7za + wget + svn + git + mercurial + cvs-rev X .7z
ããããããŠã³ããŒããããåŸãç§ãã¡ã¯äŸ¿å©ãªãã£ã¬ã¯ããªã«ãããã®äž¡æ¹ã解åããŸãã 次ã«ãMSYSã«MinGWã®å ŽæãäŒããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã
移åãã
ãã¡ã€ã«ã«ç€ºãããŠããããã«
ãã¡ã€ã«ã«
ãžã®ãã¹ãæžã蟌ã¿ãŸã
äžèšã®ãã¹ãŠãã€ã³ã¹ããŒã«ããåŸãMSYSã¿ãŒããã«ãéããŸãã ãããè¡ãã«ã¯ã
å®è¡ã
ïŒãã®é£ã«ã¯2ã€ã®ã¢ã€ã³ã³ããããŸãïŒã ãã®ã³ãã³ãã¯ããŸãUNIXã³ãã³ããšUNIXãã¹ã®åœ¢åŒããµããŒããã次ã«å¿ èŠãªãã¹ãŠã®ç°å¢ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããããããã®ã¿ãŒããã«ãããã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
ããããããŠã³ããŒããããåŸãç§ãã¡ã¯äŸ¿å©ãªãã£ã¬ã¯ããªã«ãããã®äž¡æ¹ã解åããŸãã 次ã«ãMSYSã«MinGWã®å ŽæãäŒããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã
msys/etc
移åãã
fstab.sample
ãã¡ã€ã«ã«ç€ºãããŠããããã«
fstab
ãã¡ã€ã«ã«
/mingw
ãžã®ãã¹ãæžã蟌ã¿ãŸã
fstab.sample
c:/mingw64 /mingw
äžèšã®ãã¹ãŠãã€ã³ã¹ããŒã«ããåŸãMSYSã¿ãŒããã«ãéããŸãã ãããè¡ãã«ã¯ã
msys\msys.bat
å®è¡ã
msys\msys.bat
ïŒãã®é£ã«ã¯2ã€ã®ã¢ã€ã³ã³ããããŸãïŒã ãã®ã³ãã³ãã¯ããŸãUNIXã³ãã³ããšUNIXãã¹ã®åœ¢åŒããµããŒããã次ã«å¿ èŠãªãã¹ãŠã®ç°å¢ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããããããã®ã¿ãŒããã«ãããã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
OS X
OS Xã§ã¯ãXcode 4ãããŠã³ããŒããããã®èšå®ã®[ããŠã³ããŒã]ã»ã¯ã·ã§ã³ã§ã³ãã³ãã©ã€ã³ããŒã«ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã 次ã«ãLauncherãä»ããŠã¿ãŒããã«ãŠã£ã³ããŠãéãã ãã§ãã
Linux
DebianããŒã¹ã®Linuxã§ã¯ãã¿ãŒããã«ãéããŠæ¬¡ã®ããã«èšè¿°ããŸãã
ãã®åŸãã¿ãŒããã«ãŠã£ã³ããŠãéããŠå床éããæ°ããç°å¢èšå®ãèªã¿èŸŒãŸããããã«ããå¿ èŠããããŸãã
> sudo apt-get install build-essential
ãã®åŸãã¿ãŒããã«ãŠã£ã³ããŠãéããŠå床éããæ°ããç°å¢èšå®ãèªã¿èŸŒãŸããããã«ããå¿ èŠããããŸãã
ãã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æçµè¡ã¯ãã³ãã³ãã©ã€ã³ã§å ¥åãããã®ã§ãªããã°ãªããŸããã
> g++
ããã«å¿ããŠã次ã®ãããªãã®ã衚瀺ãããŸã
g++: fatal error: no input files
ãã®ãããªã¡ãã»ãŒãžã¯ãã³ã³ãã€ã©ãŒãæŠãã®æºåãã§ããŠããããœãŒã¹ãã¡ã€ã«ãååŸããããšããŠããããšãæå³ããŸãã
1.é³¥é¡
ãŸããg ++ãã«ãAvianãææ¡ããŸãã
ãªãŒãã³ïŒ oss.readytalk.com/avian ã¹ããŒã¿ã¹ãªã³ã¯ãéžæããŸã ã éããããŒãžã§ã Avian 0.6ãããŠã³ããŒãããŸãã æ§ãããªããŒãžã§ã³çªå·ã«ãããããããããã°ã©ã ã¯å®å šã«å®å®ããŠããŸãïŒãããã«ããŠããç§ã¯ãããèœãšãããšãã§ããŸããã§ããããŸãããã°ãã©ãã«ãŒã«ã¯éåžžã«ããªãããŒãªãã°ã衚瀺ãããŸãã
ããŠã³ããŒãããAvianãœãŒã¹ãã¡ã€ã«ãç¹å®ã®ãã©ã«ããŒã«è§£åããŸãïŒã/ Projectsã«ããŸãïŒã
> cd ~/Projects
Windowsã§ã¯ãMSYSã®ããã©ã«ããŒã¯ãŠãŒã¶ãŒã®ããŒã ãã©ã«ããŒã§ã¯ãªããCïŒ\ MinGW64 \ msys \ home \ usernameãã©ã«ããŒã«æ·»ä»ãããŸãã ç§ãã¡ã®å Žåããã©ãããã©ãŒã ããå¯èœãªéãé ãã«é¢ãããã®ã§ãããã¯å©ç¹ã§ãããããŸãã
ããŠã³ããŒãããã¢ãŒã«ã€ãã®ååãavian-0.6.tar.bz2ã§ãã/ Downloadsã«ãããšãã次ã«å ¥åããŠçŸåšã®ãã©ã«ããŒã«è§£åããŸãã
> tar -xjf ~/Downloads/avian-0.6.tar.bz2
Windowsã§ã¯ããã¹ã¯ã/ c / Users / username / Downloads / avian-0.6.tar.bz2ã®åœ¢åŒã§ã¹ã©ãã·ã¥ãå«ãmingw圢åŒã§æå®ããå¿ èŠããããŸãã ãã¡ãããããªãã¯ã¢ãŒã«ã€ãã解åããããã®çŸã®ä»£æ¿æ¹æ³ã®ããããã䜿çšããããšãã§ããŸã-äž»ãªããšã¯ããããçŸåšã®ãã©ã«ãã«åé¡ãããããšã§ãã ãã®çµæãã¢ãŒã«ã€ãããå±éãããé³¥é¡ã®ãµããã©ã«ããŒãããã«è¡šç€ºãããŸãã ããã«è¡ããŸãããïŒ
> cd avian
ããã§makeã³ãã³ããå®è¡ã§ããŸãããä»ããã¢ã»ã³ããªãèµ·åãããšãzlibãèŠã€ãããªãã£ããšããã¡ãã»ãŒãžã衚瀺ãããå¯èœæ§ãé«ããªããŸãã zlib.hã®ãããªãã®ïŒãã®ãããªãã¡ã€ã«ããã£ã¬ã¯ããªã¯ãããŸããã
çª
Windowsã®å ŽåãAvianã®èè
ãææ¡ããæ¹æ³ãã€ãŸãzlibã©ã€ãã©ãªãç¹å¥ãªwin64è£å©ãªããžããªããã¹ãªããããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãã·ã¹ãã ã«gitãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã 幞ããgitã¯ã€ã³ã¹ããŒã«ããmsysãã«ãã®äžéšã§ãã æ®å¿µãªããããã®èšäºãæžããŠããæç¹ã§ã¯ãã¢ã»ã³ããªã¯æ²ãã£ãŠããŸããmsys-crypto-0.9.8.dllãã¡ã€ã«ããããŸããããã®ãã¡ã€ã«ã¯ãGoogleã§èŠã€ããŠã圹ã«ç«ããªãå
åŒã®æšªã«msys-crypto-1.0.0.dllã眮ãå¿
èŠããããŸãããã®ã¢ã»ã³ããªã¯å®äºã§ãã
次ã«ãé³¥é¡ã®ãã©ã«ããŒããã³ãã³ããå®è¡ããå¿ èŠããããŸã
ããã«ãããç¹ã«zlibã§é³¥é¡ãå¿ èŠãšããå¯èœæ§ã®ãããã¹ãŠã®ã©ã€ãã©ãªãå«ãé³¥é¡ãã©ã«ããŒã®é£ã«win64ãã©ã«ããŒãé 眮ãããŸãã
次ã«ãé³¥é¡ã®ãã©ã«ããŒããã³ãã³ããå®è¡ããå¿ èŠããããŸã
> git clone git://oss.readytalk.com/win64.git ../win64
ããã«ãããç¹ã«zlibã§é³¥é¡ãå¿ èŠãšããå¯èœæ§ã®ãããã¹ãŠã®ã©ã€ãã©ãªãå«ãé³¥é¡ãã©ã«ããŒã®é£ã«win64ãã©ã«ããŒãé 眮ãããŸãã
OS X
OS Xã§ã¯ãç§ãèŠããŠããéãã§ã¯ããã®ã©ã€ãã©ãªã¯èªåçã«ã€ã³ã¹ããŒã«ãããŸãïŒããããã€ã³ã¹ããŒã«æžã¿ã®éçºè
ããŒã«ã䜿çšããŠïŒã
Linux
Linuxã§ã¯ããã®åé¡ã¯ç°¡åã«è§£æ±ºãããŸã
> sudo apt-get install zlib1g-dev
ãã ããzlibãã€ã³ã¹ããŒã«ããŠ
make
ååºŠå ¥å
make
ãšãå¥ã®ãšã©ãŒãçºçããŸã-Avianã³ã¬ã¯ã¿ãŒã¯/ bin / javacããã°ã©ã ãèŠã€ããããŸããã Javaéçºè ã¯ãã®ããã°ã©ã ãèªèããå¯èœæ§ããããŸã-ããã¯Javaã³ã³ãã€ã©ã§ãã Avianã¯ä»®æ³ãã·ã³ã«ãããªããããOracleã®å ¬åŒã³ã³ãã€ã©ãåŒãç¶ã䜿çšããŸãã VMèªäœãæ§ç¯ããå ŽåããœãŒã¹Javaãã¡ã€ã«ãã
System
ã
ArrayList
ãŸãã¯
HashMap
ãªã©ã®å°ããªAvianæšæºã©ã€ãã©ãªã®ã¯ã©ã¹ãã³ã³ãã€ã«ããããã«å¿ èŠã§ãã ãããã£ãŠãADKãæ§ç¯ãããšããšãããã䜿çšããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããšãã®äž¡æ¹ã§ãJDKã¯éçºè ã®ãã·ã³äžã«ããå¿ èŠããããŸãã ãããŠãAvian 0.6ãšäºææ§ã®ããJDK7ãã€ã³ã¹ããŒã«ããããšãæãŸããã§ãã JREã®ãããªã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã¯ããããããå¿ èŠãšããŸããïŒå®éããããè©Šã¿ãŠããŸãïŒã
çª
Windowsã§ãOracle Webãµã€ãã«ã¢ã¯ã»ã¹ããç®çã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
OS X
OS Xã§ã¯ãWindowsãšåæ§ã«ãOracle Webãµã€ãã«ã¢ã¯ã»ã¹ããŠç®çã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ãããŠã³ããŒãããã€ã³ã¹ããŒã«ããŸãã
Linux
Linuxã§ã¯ãéåžžã®ãã³ãã©ã䜿çšããŸã
ïŒããããããã£ã¹ããªãã¥ãŒã·ã§ã³ã«OpenJDKãå«ãŸããŠããªãããããã±ãŒãžã®ååãä»ã®æ¹æ³ã§ä»ããããŠããå¯èœæ§ããããŸããããããLinuxã¯Linuxã§ã-èŠãŠèŠã€ããŠãã ãããïŒ
> sudo apt-get install openjdk-7-jdk
ïŒããããããã£ã¹ããªãã¥ãŒã·ã§ã³ã«OpenJDKãå«ãŸããŠããªãããããã±ãŒãžã®ååãä»ã®æ¹æ³ã§ä»ããããŠããå¯èœæ§ããããŸããããããLinuxã¯Linuxã§ã-èŠãŠèŠã€ããŠãã ãããïŒ
Javaéçºç°å¢ãé 眮ããå Žæã確èªããããã«ãmakeã¯JAVA_HOMEç°å¢å€æ°ãèªã¿åããŸãããã®ç°å¢å€æ°ãæ£ããèšå®ããå¿ èŠããããŸãã ç¬èªã®ãããžã§ã¯ããçµã¿ç«ãŠãããã«ãåŸã§åãå€ãæã€ãã®åãå€æ°ãå¿ èŠã«ãªããŸãã
çª
Windowsäžã®MinGWãžã®ãã¹ã¯ããããã/ c / Program \ Files / Java / jdk1.7.0_07 /ïŒJDK7ã®ã€ã³ã¹ããŒã«æã«æå®ããïŒã®ãããªãã®ã«ãªããŸãã
OS X
OS Xã§ã¯ãJDK7ã¯/Library/Java/JavaVirtualMachines/jdk1.7.0_17.jdk/Contents/Homeã«ã€ã³ã¹ããŒã«ãããŸã
Linux
Linuxã§ã¯ã次ã®ããã«ãªããŸãã
> update-java-alternatives -l java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64 > export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
ãããŠæåŸã«ãæé«ã®æé-ç§ãã¡ã¯AvianãåéããŸãïŒ
> make
ãã¹ãŠãæ£ããè¡ã£ãå Žåãbuild / <ãã©ãããã©ãŒã å> / <ãã¡ã€ã«>ãã³ã³ãã€ã«ãã次ã«build / <ãã©ãããã©ãŒã å> / <ãã¡ã€ã«>ããªã³ã¯ãã圢åŒã®äžé£ã®è¡ã衚瀺ãããŸãã ã¢ã»ã³ããªããã»ã¹ã®çµäºæã«ãbuild / <your platform_name>ãã©ã«ããŒã«å€ãã®ãã¡ã€ã«ãåãåããŸãããããã§ã®ã¿é¢å¿ããããŸãã
- classpath.jarã¯ãããã°ã©ã ã§äœ¿çšããåºæ¬ã¯ã©ã¹ã®æå°ã©ã€ãã©ãªã§ãã OpenJDKã©ã€ãã©ãªã䜿çšããŠAvianããã«ãããæ©äŒããããŸããããŸããç§ãç解ããŠããããã«ãã©ã€ã»ã³ã¹ã®çš®é¡ãå°ãªãã次ã«éããšããããšã§ãã
- binaryToObjectïŒ.exeïŒ -ã¢ããªã±ãŒã·ã§ã³ã«Avianãåã蟌ãããã«å¿
èŠãªãŠãŒãã£ãªãã£ããã®ç®çã¯åŸã§é瀺ãããŸãã
- libavian.aã¯æãéèŠãªãã¡ã€ã«ã§ãã å®éãããã¯çµã¿èŸŒã¿ã®ä»®æ³ãã·ã³ã§ãã 23ã¡ã¬ãã€ããããããŸãããå¿é
ããªãã§ãã ããã 圌ã¯ãããã€ãã®åçŽãªããããŠéèŠãªããšã«ã¯ãå®å
šã«ç¡å®³ã§èªåçãªæäœã®åŸãèããäœéãæžãããŸãããã®æ¬è³ªãåŸã§æããã«ãããŸãã
2. Javaã®ã¯ãã¹ãã©ãããã©ãŒã ã«äŸåããªãã¢ããªã·ãã¯hello
å¿ èŠãªãã¹ãŠã®ãµãŒãããŒãã£ã³ãŒããã³ã³ãã€ã«ããŸããã ã§ã¯ãç¬èªã«äœæããŸãããã
ã¿ã¹ã¯ã¯ãJavaã§æžãããããã°ã©ã ãäœæããããšã§ããããã°ã©ã ã¯ãã§ããã ããã©ãããã©ãŒã ã«äŸåããªãããã¯ããŒã¯ãã§ããã ãå°ãªãå«ã¿ãåç¬ã§ç¹å¥ãªã€ã³ã¹ããŒã«ãå¿ èŠãšããããã¯ãªãŒã³ãã·ã¹ãã ã§åäœããåäžã®exeãã¡ã€ã«ã«ã¢ã»ã³ãã«ãããŸãäŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ã
2.1ã JNIã«ã€ããŠå°ã
çè«ããå§ããŸãããã JVMãã·ã¹ãã ãšå¯Ÿè©±ããæ¹æ³ã«ã€ããŠèª¬æããŸãããã ãŸããå€éšç°å¢ããæœè±¡åããããã«ãä»®æ³ãã·ã³ãäœæãããŸãã ãããã£ãŠãVMã®å®è£ ã®ããã«ããã¯ãã·ã¹ãã é¢æ°ã®åŒã³åºãã ãã§ããããšã¯é©ãããšã§ã¯ãããŸããã ææ°ã®ããã°ã©ã ã¯ãOSã®åå ãªãã«ã¯ããããã¿ãããã§ããŸããã ãã£ã¹ã¯ãžã®èªã¿åã/æžã蟌ã¿ã¯ã·ã¹ãã æ©èœã§ãã ã³ã³ãœãŒã«ãžã®ããã¹ãåºåã¯ã·ã¹ãã é¢æ°ã§ãã ç»é¢ã«ãŠã£ã³ããŠãæç»ããŸã-ããªãã¯ã©ãæããŸããïŒ
å®éãã¢ããªã±ãŒã·ã§ã³ããå éšã§ãå®è¡ã§ããã®ã¯ãèšç®ãšææ決å®ã ãã§ãã VMã®æ©èœã¯ããããã®ã¢ã¯ã·ã§ã³ïŒç®è¡æŒç®ãšããžãã¯ïŒã§ãã ä»ã®äœããããå¿ èŠããããšããã«ã圌女ã¯å€éšç°å¢ãåŒã³åºããŸãã ããããã©ã®ããã«ïŒ Javaã®å Žåããã®ããã®JNIïŒJava Native InterfaceïŒããããŸãã ãã®æ¬è³ªã¯éåžžã«ã·ã³ãã«ã§ãã Javaã§èšè¿°ãããããã°ã©ã ã«ã¯ããã€ãã£ã修食åã§ããŒã¯ãããé¢æ°ããããŒãå«ãŸããŠããŸãã äŸãã°
package packagename; { class ClassName { void native foo(); } }
ãã®ãããªé¢æ°ã¯ãJavaã³ã³ãã€ã©ãŒã«ãã£ãŠãéåžžã®ïŒéä»®æ³ïŒã³ãŒãã®ããŒããããã©ã€ãã©ãªãŒããåŒã³åºãããé¢æ°ãšããŠç解ãããŸãã ãããã®ã©ã€ãã©ãªã®1ã€ã¯æ¬¡ã®ããã«ãªããŸã
extern "C" JNIEXPORT void JNICALL Java_packagename_ClassName_foo(JNIEnv * env, jobject caller) { ⊠}
Javaã³ãŒãã§
foo()
é¢æ°ãåŒã³åºãå Žåãå®éã«ã¯ãã€ãã£ãã©ã€ãã©ãªããé¢æ°ãåŒã³åºãã
JNIEnv
ç°å¢ãžã®ãã€ã³ã¿ãŒãæž¡ããŸã
JNIEnv
å ã®ããŒã¿ãšã³ãŒããšãéä¿¡ãã§ãããªããžã§ã¯ããããã³é¢æ°ãåŒã³åºããããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒ-
jobject caller
ïŒé¢æ°ãéçã§ããå Žåããªããžã§ã¯ãã®èšè¿°åã®ä»£ããã«ã¯ã©ã¹èšè¿°å
jclass caller_class
ïŒã Javaã«ç²ŸéããŠãããJNIãåŠãã§ããªã人ã«ãšã£ãŠããã®çžäºäœçšã®åçã¯æ¬¡ã®ããã«èª¬æã§ããŸããJNIã¯å€éšãã€ãã£ãã³ãŒããJavaããã°ã©ã ãåæ ã§ããããã«ããŸãã ãã®ãã¯ãããžãŒãããã«è©³ãã調ã¹ããå Žåã¯ããªã©ã¯ã«ã®å ¬åŒWebãµã€ãã®ç¹å¥ãªã»ã¯ã·ã§ã³ã«ããããã
2.2ã JNIãã€ã€ãªã³ã°
ãªããã®æè²ããã°ã©ã ããã¹ãŠãã£ãã®ã§ããïŒ æ¬¡ã«ãéåžžã«èå³æ·±ããã»ãŒéã®ã¿ã¹ã¯ã«çŽé¢ããŠããŸãã libavian.aã©ã€ãã©ãªã«éçã«ãªã³ã¯ãããŠããããã€ãã£ãå®è¡å¯èœãã¡ã€ã«ãå®è¡ããå¿ èŠããããŸãããã®ãã¡ã€ã«ã«ã¯ãJVMãçŽæ¥å«ãŸããŸãã ããã«ãããšã³ããªãã€ã³ãããå«ããã¹ãŠã®å¿ èŠãªJavaã¯ã©ã¹ãå«ãŸããŸã-ãã©ãŒã ã®ã¯ã©ã¹
class Application { public static void main(String... args) { ⊠} }
ããã¯ãã¹ãŠããªãæãããã«èãããŸãããã¿ã¹ã¯ã¯éåžžã«ç°¡åã§ãã ç¬èªã®ãã€ããªãã¡ã€ã«å ããAvianã¯ã©ã¹ã©ã€ãã©ãªïŒ
Application
ã¯ã©ã¹ãè¿œå ãããŠããïŒãåŒãåºããåãJNIã䜿ââçšããŠã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒãšå ±ã«JVMã«äŸçµŠãããããªãåçŽãªCã³ãŒããèšè¿°ããå¿ èŠããããŸãã 次ã«ããã®Cãã¡ã€ã«ãç¹å¥ãªæ¹æ³ã§ãªã³ã¯ããŠããã¹ãŠããã®å Žæã«ããããã«ããçµæã楜ãã¿ãŸãã
2.3ã æ°ãããããžã§ã¯ããšã©ã€ãã©ãª
次ã«ãããã«äœæ¥ãé²ããããã«å¿ èŠãªãã¹ãŠã®ã³ã³ããŒãã³ããçšæããŠæŽçããŸãã ããã§èª¬æããã®ã¯ãç§èªèº«ã®ã¢ãããŒãã§ãã ãã¡ãããããªãã¯æãããã«ãç©äºãèªç±ã«å€ããããšãã§ããŸãã ããããGitHubã«æçš¿ããå 容ãæ£ç¢ºã«ååŸãããå ŽåïŒãªã³ã¯ã¯æåŸã«ãªããŸãïŒããã¹ãŠãæ£ç¢ºã«å®è¡ããŠãã ããã
ã¯ãã¹ããŒã¹ãã©ã«ããŒã奜ããªå Žæã«äœæããŸãïŒé³¥é¡ãšwin32ã®é£ã®ãããžã§ã¯ãã§äœæããŸããïŒ
> mkdir crossbase && cd crossbase
å éšã§ãlibsã®ãµããã©ã«ããŒãäœæããŸã
> mkdir lib && cd lib
å éšã§ãçŸåšã®OSã®ååã§ãµããã©ã«ããŒãäœæããŸãã linuxãwin32ããŸãã¯osxã§ããå¿ èŠããããŸãã
> mkdir win-x86_64 && cd win-x86_64
ãã®ãã©ã«ãã«ãå ã»ã©åéããlibavian.aãã³ããŒããå¿ èŠããããŸãã ç§ã«ãšã£ãŠã¯ãã®ããã«èŠããŸãïŒ
> cp ../../../avian/build/windows-i386/libavian.a ./
ããã«ãzlibããªãWindowsã·ã¹ãã ã§ã¯ãlibz.aãåããã©ã«ããŒã«ã³ããŒããå¿ èŠããããŸãã
> cp ../../../win-x86_64/lib/libz.a ./
ãããã£ãŠãå¿ èŠãªæå°éã®ã©ã€ãã©ãªãåéããŸããã ããã¯åçŽãªããã°ã©ã ã«ã¯ååã§ãã
ã©ã€ãã©ãªã«å ããŠãclasspath.jarãå¿ èŠã«ãªããŸãããããavianã§ãã«ããããŸããã
> cd .. > mkdir java && cd java > cp ../../../avian/build/windows-i386/classpath.jar ./
ãããŠãä»åºŠã¯ç¥ç§çãªbinaryToObjectã®ç®çãæããã«ããŸãã jarãã¡ã€ã«ãç¹å¥ãªãªããžã§ã¯ããã¡ã€ã«ã«å€æãããªã³ã«ãŒã«è»¢éããŠããã°ã©ã ã«è¿œå ããããã«å¿ èŠã§ãã ãã®æé ã¯åã¢ã»ã³ããªäžã«å®è¡ããå¿ èŠããããããæ°ãããããžã§ã¯ãã«ãã©ãã°ããå¿ èŠããããŸãã
> cd ../..
ïŒlibãäœæããcrossbaseãã©ã«ããŒã«æ»ããŸãïŒ
> mkdir -p tools/win-x86_64 && cd tools/win-x86_64
ååwin-x86_64ã¯ãååãšåãæ¹æ³ã§å éšãã©ã«ããŒã«å²ãåœãŠãããŸãã ããã«binaryToObjectãã¹ããŒããŸãã ïŒWindowsã§ã¯ããã¡ããexeæ¡åŒµåãä»ããŠããŸãïŒ
> cp ../../../avian/build/windows-i386/binaryToObject/binaryToObject.exe ./
å®è¡ããŠäœ¿çšæ¹æ³ã確èªã§ããŸãã
usage: c:\Users\imizus\Projects\crossbase\crossbase\tools\win32\binaryToObject.exe <input file> <output file> <start name> <end name> <platform> <architecture> [<alignment> [{writable|executable}...]]
2.4ã ããã°ã©ã ã³ãŒã
ããã§ã¯ãã³ãŒããæžãå§ããŸãããã C ++ã§æ°ãããœãŒã¹ãã¡ã€ã«ãäœæããŸãããïŒã奜ã¿ã®ããã¹ããšãã£ã¿ãŒã䜿çšã§ããŸããEclipseã䜿çšããŸããåããããžã§ã¯ãå ã§C ++ãšJavaã®äž¡æ¹ãç·šéã§ããŸãããå°ãæ§æããå¿ èŠããããŸãïŒã
> mkdir -p src/cpp && cd src/cpp
å éšã§ã¯ã次ã®å 容ã§main.cppãã¡ã€ã«ãäœæããŸãïŒãã®å šäœã説æãã次ã«äœã説æããŸãïŒã
#include <stdint.h> #include <string.h> #ifdef __MINGW32__ #include <windows.h> #endif #include <jni.h> #if (defined __MINGW32__) # define EXPORT __declspec(dllexport) #else # define EXPORT __attribute__ ((visibility("default"))) \ __attribute__ ((used)) #endif #if (! defined __x86_64__) && (defined __MINGW32__) # define SYMBOL(x) binary_boot_jar_##x #else # define SYMBOL(x) _binary_boot_jar_##x #endif extern "C" { extern const uint8_t SYMBOL(start)[]; extern const uint8_t SYMBOL(end)[]; EXPORT const uint8_t* bootJar(unsigned* size) { *size = SYMBOL(end) - SYMBOL(start); return SYMBOL(start); } } // extern "C" int main(int argc, const char** argv) { #ifdef __MINGW32__ // For Windows: Getting command line as a wide string int wac = 0; wchar_t** wav; wav = CommandLineToArgvW(GetCommandLineW(), &wac); #else // For other OS: Getting command line as a plain string (encoded in UTF8) int wac = argc; const char** wav = argv; #endif JavaVMInitArgs vmArgs; vmArgs.version = JNI_VERSION_1_2; vmArgs.nOptions = 1; vmArgs.ignoreUnrecognized = JNI_TRUE; JavaVMOption options[vmArgs.nOptions]; vmArgs.options = options; options[0].optionString = const_cast<char*>("-Xbootclasspath:[bootJar]"); JavaVM* vm; void* env; JNI_CreateJavaVM(&vm, &env, &vmArgs); JNIEnv* e = static_cast<JNIEnv*>(env); jclass c = e->FindClass("crossbase/Application"); if (not e->ExceptionCheck()) { jmethodID m = e->GetStaticMethodID(c, "main", "([Ljava/lang/String;)V"); if (not e->ExceptionCheck()) { jclass stringClass = e->FindClass("java/lang/String"); if (not e->ExceptionCheck()) { jobjectArray a = e->NewObjectArray(wac - 1, stringClass, 0); if (not e->ExceptionCheck()) { for (int i = 1; i < wac; ++i) { #ifdef __MINGW32__ // For Windows: Sending wide string to Java int arglen = wcslen(wav[i]); jstring arg = e->NewString((jchar*) (wav[i]), arglen); #else // For other OS: Sending UTF8-encoded string to Java int arglen = strlen(wav[i]); jstring arg = e->NewStringUTF((char*) (wav[i])); #endif e->SetObjectArrayElement(a, i - 1, arg); } e->CallStaticVoidMethod(c, m, a); } } } } int exitCode = 0; if (e->ExceptionCheck()) { exitCode = -1; e->ExceptionDescribe(); } vm->DestroyJavaVM(); return exitCode; }
__MINGW32__
ã¯ãïŒäºæ³å€ã«ïŒïŒMinGW32ç°å¢å ã§èªåçã«èšå®ãããããªããã»ããµã·ã³ãã«ã§ãã ããã«ãããWindowsãåºå¥ããããšãã§ããŸããWindowsã¯ãçãããèããŠããããã«ãä»ã®ãã¹ãŠã®ã·ã¹ãã ãšã¯ãŸã£ããç°ãªãããšã«æ°ã¥ããŠããŸãã ç¹ã«ãWindowsã§ã®ã¿ç¹å¥ãªã·ã¹ãã APIãå¿ èŠã«ãªããŸããããã¯ã
#include <windows.h>
è¡ã§æ¥ç¶ããŸãã ä»ã®ãã©ãããã©ãŒã ã§ã¯ãæšæºã®POSIXããã³ANSI C ++ã©ã€ãã©ãªã¯äžèŠã§ãã ãªãå¿ èŠãªã®ã§ããïŒ ããã¯å°ãåŸã«æããã«ãªããŸãã ã³ãŒããé çªã«è¡šç€ºããŸãã
#if (defined __MINGW32__) # define EXPORT __declspec(dllexport) #else # define EXPORT __attribute__ ((visibility("default"))) \ __attribute__ ((used)) #endif
ãã®ã³ãŒãã¯ãgccã䜿çšããŠã¯ãã¹ãã©ãããã©ãŒã ã®åçã©ã€ãã©ãªãäœæãããã¹ãŠã®äººã«ãªãã¿ãããç解ãããããã®ã§ãã ãã®æ¬è³ªã¯ãç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ãã©ã€ãã©ãªãããšã¯ã¹ããŒãããå¿ èŠã®ããé¢æ°ã®èšè¿°ãç°ãªãããšã§ãã ããããŠãããã«åçã©ã€ãã©ãªããããŸããå®è¡å¯èœãã¡ã€ã«ãåéããŠããããã§ããïŒã ããã«å¿ããŠãAvianã¯ã©ã€ãã©ãªããé¢æ°ãåŒã³åºãããšãå«ãJNIã¡ã«ããºã ãä»ããŠãã©ãããã©ãŒã åºæã®ã³ãŒããšå¯Ÿè©±ããããšãæãåºããŸãã ã€ãŸããJavaã³ãŒãã§ã¯ãå®è¡å¯èœãã¡ã€ã«ã¯ã¹ã¿ãŒãã¢ããããã°ã©ã ã ãã§ãªããé¢æ°ã®åçã©ã€ãã©ãªã§ããããŸãã
次ã®éšåã¯å¥åŠãªéæ³ã§ãã
#if (! defined __x86_64__) && (defined __MINGW32__) # define SYMBOL(x) binary_boot_jar_##x #else # define SYMBOL(x) _binary_boot_jar_##x #endif extern "C" { extern const uint8_t SYMBOL(start)[]; extern const uint8_t SYMBOL(end)[]; EXPORT const uint8_t* bootJar(unsigned* size) { *size = SYMBOL(end) - SYMBOL(start); return SYMBOL(start); } } // extern "C"
ãããç解ããŸãããã ç¹å®ã®ãšã¯ã¹ããŒãé¢æ°ã宣èšããŸãïŒ
extern "C"
ãšå ¥åããã°ããã®
EXPORT
ãã£ã¬ã¯ãã£ããèŠãŠãã ãããé¢æ°åã¯
bootJar
ã§ãããã®ååã
bootJar
ããããäœãããããèŠãŠãã ãããããªããã»ããµãã£ã¬ã¯ãã£ãã粟ç¥çã«è§£æãããšãè·é¢ãèšç®ããããšãããããŸãããã€ãã®_binary_boot_jar_startãš_binary_boot_jar_endã®éïŒMinGW32ã§ã¯ãå é ã«ã¢ã³ããŒã¹ã³ã¢ã¯ãããŸããïŒãããã®æåèªäœã¯
extern
ãšããŠå®£èšãããŠããŸããã€ãŸãããªã³ã«ã§çœ®æããå¿ èŠããããŸãã
å®éã以äžã§èª¬æããããã«ãäœããã¹ãããç¥ã£ãŠããã°ããã¹ãŠãéåžžã«ç°¡åã§ãã Avianã¯ã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãŸããããã«èšèšãããŠãããããäœæè ã¯ã¯ã©ã¹ã©ã€ãã©ãªãå®è¡å¯èœãã¡ã€ã«ã«çŽæ¥è¿œå ããããããããŠã³ããŒãããå¯èœæ§ãæäŸããŸããã ãããè¡ãã«ã¯ãã©ã€ãã©ãªããªããžã§ã¯ããã¡ã€ã«ã«å€æããã ãã§ãã ã¯ããã¯ããç§ãæåã¯é©ããŸããããããã¯éåžžã«ãšã¬ã¬ã³ããªã¢ã€ãã¢ã§ãã jarãå«ããªããžã§ã¯ããã¡ã€ã«ã§ã¯ãäœæãããš2æåã宣èšããããã®jarãã¡ã€ã«ã®éå§ïŒ
_binary_boot_jar_start
ïŒãšçµäºïŒ
_binary_boot_jar_end
ïŒã瀺ããŸãã ãããŠã
bootJar
ã¯
bootJar
é¢æ°ã䜿çšããŠãéå§å Žæãšãã®æéã調ã¹ãŸãã å ãèŠãŠããã®é¢æ°ã®ååã¯æååãšããŠæž¡ããããšèšããŸã
options[0].optionString = const_cast<char*>("-Xbootclasspath:[bootJar]");
æåŸã«ããšã³ããªãã€ã³ã-
main
é¢æ°ã«å°éããŸããã 圌女ã®ä»äºã¯æ¬¡ã®ãšããã§ãã
- ãã©ã¡ãŒã¿æååãèªã¿åã
- ã¯ã©ã¹ã©ã€ãã©ãªãæž¡ããŠAvianãããŠã³ããŒããã
- crossbase.Applicationã¯ã©ã¹ããã¡ã€ã³é¢æ°ãåŒã³åºããã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒãæž¡ããŸã
- äžèšã®ããããã倱æããå Žåããšã©ãŒã§é£ã³åºãã®ã¯è¯ãããšã§ã
é¢æ°ã®æåããè¡ããŸãããïŒ
#ifdef __MINGW32__ // For Windows: Getting command line as a wide string int wac = 0; wchar_t** wav; wav = CommandLineToArgvW(GetCommandLineW(), &wac); #else // For other OS: Getting command line as a plain string (encoded in UTF8) int wac = argc; const char** wav = argv; #endif
ããã§ããã€ãã®ããã«ãWindowsã¯åªããŠããŸããã å€ãäžäŸ¿ãªã·ã³ã°ã«ãã€ããšã³ã³ãŒãã£ã³ã°ããããè€éãªãšã³ã³ãŒãã£ã³ã°ã«åãæ¿ãããšãã決å®ãè³ãæã§è¡ããããšãããã¹ãŠã®OSã¯äŸ¿å©ãªUTF-8ã«åãæ¿ãããMicrosoftã®ãæ°ã«å ¥ãã®ãã¬ã€ã³ãã£ã€ã«ãã¯åºå®2ãã€ããšã³ã³ãŒãã£ã³ã°ã«åãæ¿ãããŸããã ãã ãããã¡ã€ã«åãªã©ã§äœ¿çšããããšã³ã³ãŒãã£ã³ã°ã«ã€ããŠã¯ãŸã£ããæ°ã«ããŸããã§ããã ãããããšã³ã³ãŒãã£ã³ã°ã¯ä»ã§ã¯ããŸãæ°ã«ããŸããã Javaã§ãã©ã¡ãŒã¿ãŒæååãæž¡ãå¿ èŠããããŸãïŒããã¯2ãã€ã
char
ãåãå ¥ããŸãïŒã ãããã£ãŠãWindowsã®å ŽåãAPIé¢æ°ïŒwindows.hããã©ãã°ãããã®ïŒãåŒã³åºããŸããããã«ãããæ£ãã2ãã€ããšã³ã³ãŒãã£ã³ã°ã®ãã©ã¡ãŒã¿ãŒæååãæäŸãããŸãã ãã®ãããããšãã°ãååã«ããªã«æåãå«ãŸãããã¡ã€ã«ãéãããšãã§ããŸãã ä»ã®ãã¹ãŠã®ã·ã¹ãã ã§ã¯ã
main
é¢æ°ã®åŒæ°ãããã©ã¡ãŒã¿ãŒãèªã¿åãã ãã§ãã
以äžã¯ãJavaä»®æ³ãã·ã³ã®äœæã§ãã
JavaVMInitArgs vmArgs; vmArgs.version = JNI_VERSION_1_2; vmArgs.nOptions = 1; vmArgs.ignoreUnrecognized = JNI_TRUE; JavaVMOption options[vmArgs.nOptions]; vmArgs.options = options; options[0].optionString = const_cast<char*>("-Xbootclasspath:[bootJar]"); JavaVM* vm; void* env; JNI_CreateJavaVM(&vm, &env, &vmArgs); JNIEnv* e = static_cast<JNIEnv*>(env);
ãŸãã
JNIEnv
ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãåŒãåºããŸããããã䜿çšããŠãæ°ããäœæãããJavaãã·ã³ã«ã³ãã³ãã
JNIEnv
ãŸãã
ããã«ã³ãŒãã¯ãMayakovskyã®è©©ãšããŠèªã¿åãããŸãïŒå°ãã®JNIãç¥ã£ãŠããå Žåã®ã¿ïŒã
jclass c = e->FindClass("crossbase/Application"); if (not e->ExceptionCheck()) { jmethodID m = e->GetStaticMethodID(c, "main", "([Ljava/lang/String;)V"); if (not e->ExceptionCheck()) { jclass stringClass = e->FindClass("java/lang/String"); if (not e->ExceptionCheck()) { jobjectArray a = e->NewObjectArray(wac - 1, stringClass, 0); if (not e->ExceptionCheck()) { for (int i = 1; i < wac; ++i) { #ifdef __MINGW32__ // For Windows: Sending wide string to Java int arglen = wcslen(wav[i]); jstring arg = e->NewString((jchar*) (wav[i]), arglen); #else // For other OS: Sending UTF8-encoded string to Java int arglen = strlen(wav[i]); jstring arg = e->NewStringUTF((char*) (wav[i])); #endif e->SetObjectArrayElement(a, i - 1, arg); } e->CallStaticVoidMethod(c, m, a); } } } } int exitCode = 0; if (e->ExceptionCheck()) { exitCode = -1; e->ExceptionDescribe(); }
crossbase/Application
ã¯ã©ã¹ã
crossbase/Application
ã å¯èœã§ããã°ããã®äžã«ã·ã°ããã£
([Ljava/lang/String;)V
æã€éçã¡ãœãã
main
ãèŠã€ããŸã
([Ljava/lang/String;)V
å¯èœã§ããã°ãæšæºã©ã€ãã©ãªãã
java/lang/String
ã¯ã©ã¹ãååŸããŸãã å¯èœã§ããã°ããã®ã¯ã©ã¹ã®ãªããžã§ã¯ãã®é åãäœæããŸãïŒãããã¯ãã©ã¡ãŒã¿ãŒã«ãªããŸãïŒãå¯èœã§ããã°ããã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§encoding
UTF-8
ã§æå®ãããåãã©ã¡ãŒã¿ãŒããjavaæååãäœæããWindowsã§ã¯2ãã€ãè¡šçŸã䜿çšããŠçŽæ¥äœæããŸãã
äœãã§ããªãã£ãå ŽåããŠãŒã¶ãŒã«ãšã©ãŒãçºè¡ããŸãã
ããã¯å®éãå šäœã®ãããªã¬ãŒãã§ãã次ã«ãJavaããã°ã©ã ãäœæããå¿ èŠããããŸããå°ãªããšãã
crossbase.Application
methodãæã€ã¯ã©ã¹ãå«ããå¿ èŠããã
public static void main(String... args)
ãŸãã
crossbase / srcãã©ã«ããŒã«javaãµããã©ã«ããŒãäœæãããã®äžã«ã¯ãã¹ããŒã¹ãµããã©ã«ããŒïŒããã¯ããã±ãŒãžåã§ãïŒãäœæããå éšã«æ¬¡ã®å 容ã®Application.javaãã¡ã€ã«ãäœæããŸãã
package crossbase; public class Application { public static void main(String... args) { System.out.println("This is a crossplatform monolith application with Java code inside. Freedom to Java apps!"); for (int i = 0; i < args.length; i++) { System.out.println("args[" + i + "] = " + args[i]); } } }
å°ãJavaãç¥ã£ãŠãããªããããã§ã®ã³ã¡ã³ãã¯äžèŠã ãšæããŸããæšæºã®Avianã¯ã©ã¹ã©ã€ãã©ãªã«ã¯ãæååããã©ãŒãããããæ段ããããŸããïŒããšãã°ãOpenJDKããéãã«åŒãé¢ã人ã¯ããŸããïŒã
2.5ã çµç«
ããã§ã¯ããããžã§ã¯ããçµã¿ç«ãŠãã¿ã¹ã¯ã«ç§»ããŸããããmakeã䜿çšããã®ã¯ãgccãåžžã«ã©ãã«ã§ãããããã§ãããããŠåœŒã¯ãã»ãŒãã¹ãŠã®èªåãã«ãã·ã¹ãã ã«æžã蟌ãããšãã§ããã»ã©åŒ·åã§ãããããããããªããæã§ç§ãäœãããšãã§ããªãã£ãããšããªã¹ãããããšãã§ããŸãããããŠããããã¯ã»ãšãã©éèŠãªãã®ã§ãããMakefileã¯ãã¯ãã¹ããŒã¹ãã©ã«ããŒã«çŽæ¥é 眮ããã次ã®ããã«ãªããŸãã
UNAME := $(shell uname) ARCH := $(shell uname -m) SRC = src BIN = bin OBJ = obj JAVA_SOURCE_PATH = $(SRC)/java JAVA_CLASSPATH = $(BIN)/java CPP_SOURCE_PATH = $(SRC)/cpp OBJECTS = $(OBJ) DEBUG_OPTIMIZE = -O3 #-O0 -g ifeq ($(UNAME), Darwin) # OS X PLATFORM_ARCH = darwin x86_64 PLATFORM_LIBS = osx-x86_64 PLATFORM_GENERAL_INCLUDES = -I"$(JAVA_HOME)/include" -I"$(JAVA_HOME)/include/darwin" PLATFORM_GENERAL_LINKER_OPTIONS = -framework Carbon PLATFORM_CONSOLE_OPTION = EXE_EXT= STRIP_OPTIONS=-S -x RDYNAMIC=-rdynamic else ifeq ($(UNAME) $(ARCH), Linux x86_64) # linux on PC PLATFORM_ARCH = linux x86_64 PLATFORM_LIBS = linux-x86_64 PLATFORM_GENERAL_INCLUDES = -I"$(JAVA_HOME)/include" -I"$(JAVA_HOME)/include/linux" PLATFORM_GENERAL_LINKER_OPTIONS = -lpthread -ldl PLATFORM_CONSOLE_OPTION = EXE_EXT= STRIP_OPTIONS=--strip-all RDYNAMIC=-rdynamic else ifeq ($(OS), Windows_NT) # Windows PLATFORM_ARCH = windows x86_64 PLATFORM_LIBS = win-x86_64 PLATFORM_GENERAL_INCLUDES = -I"$(JAVA_HOME)/include" -I"$(JAVA_HOME)/include/win32" PLATFORM_GENERAL_LINKER_OPTIONS = -static -lmingw32 -lmingwthrd -lws2_32 -mwindows -static-libgcc -static-libstdc++ PLATFORM_CONSOLE_OPTION = -mconsole EXE_EXT=.exe STRIP_OPTIONS=--strip-all RDYNAMIC= endif JAVA_FILES = $(shell cd $(JAVA_SOURCE_PATH); find . -name \*.java | awk '{ sub(/.\//,"") }; 1') JAVA_CLASSES := $(addprefix $(JAVA_CLASSPATH)/,$(addsuffix .class,$(basename $(JAVA_FILES)))) CPP_FILES = $(shell cd $(CPP_SOURCE_PATH); find . -name \*.cpp | awk '{ sub(/.\//,"") }; 1') CPP_OBJECTS := $(addprefix $(OBJECTS)/,$(addsuffix .o,$(basename $(CPP_FILES)))) all: $(BIN)/crossbase $(JAVA_CLASSPATH)/%.class: $(JAVA_SOURCE_PATH)/%.java @echo $(PLATFORM_GENERAL_INCLUDES) if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi "$(JAVA_HOME)/bin/javac" -sourcepath "$(JAVA_SOURCE_PATH)" -classpath "$(JAVA_CLASSPATH)" -d "$(JAVA_CLASSPATH)" $< $(OBJ)/%.o: $(SRC)/cpp/%.cpp @echo $(PLATFORM_GENERAL_INCLUDES) mkdir -p $(OBJ) g++ $(DEBUG_OPTIMIZE) -D_JNI_IMPLEMENTATION_ -c $(PLATFORM_GENERAL_INCLUDES) $< -o $@ $(BIN)/crossbase: $(JAVA_CLASSES) $(CPP_OBJECTS) mkdir -p $(BIN); @echo $(PLATFORM_GENERAL_INCLUDES) # Extracting libavian objects ( \ cd $(OBJ); \ mkdir -p libavian; \ cd libavian; \ ar x ../../lib/$(PLATFORM_LIBS)/libavian.a; \ ) # Making the java class library cp lib/java/classpath.jar $(BIN)/boot.jar; \ ( \ cd $(BIN); \ "$(JAVA_HOME)/bin/jar" u0f boot.jar -C java .; \ ) # Making an object file from the java class library tools/$(PLATFORM_LIBS)/binaryToObject $(BIN)/boot.jar $(OBJ)/boot.jar.o _binary_boot_jar_start _binary_boot_jar_end $(PLATFORM_ARCH); \ g++ $(RDYNAMIC) $(DEBUG_OPTIMIZE) -Llib/$(PLATFORM_LIBS) $(OBJ)/boot.jar.o $(CPP_OBJECTS) $(OBJ)/libavian/*.o $(PLATFORM_GENERAL_LINKER_OPTIONS) $(PLATFORM_CONSOLE_OPTION) -lm -lz -o $@ strip $(STRIP_OPTIONS) $@$(EXE_EXT) clean: rm -rf $(OBJ) rm -rf $(BIN) .PHONY: all
泚æããŠãã ããïŒã¿ããšã¹ããŒã¹ãæ··åããªãã§ãã ãã; makeã¿ãã§ã¯ãã¢ã»ã³ããªã«ãŒã«å ã®ã³ãã³ãã匷調衚瀺ãããã¹ããŒã¹ã¯æ§æèŠçŽ ã§ã¯ãããŸããããããã©ã®ããã«æ©èœãããã詳ããèŠãŠã¿ãŸããããå€ããå°ãªããå¯äžã®è³ã®æ§é ã¯ããããã®å€æ°ã®ç®çã§ãïŒ
JAVA_FILES = $(shell cd $(JAVA_SOURCE_PATH); find . -name \*.java | awk '{ sub(/.\//,"") }; 1') JAVA_CLASSES := $(addprefix $(JAVA_CLASSPATH)/,$(addsuffix .class,$(basename $(JAVA_FILES)))) CPP_FILES = $(shell cd $(CPP_SOURCE_PATH); find . -name \*.cpp | awk '{ sub(/.\//,"") }; 1') CPP_OBJECTS := $(addprefix $(OBJECTS)/,$(addsuffix .o,$(basename $(CPP_FILES))))
ããã§ã¯
.java
ããã©ã«ãå ã®ãã¹ãŠã®ãã¡ã€ã«ãæ€çŽ¢ããããã«find unixã³ãã³ãã䜿çšããŠããŸã
$(JAVA_SOURCE_PATH)
ããããã®ãã¡ã€ã«ãã³ã³ãã€ã«ããå¿ èŠããããŸãã次ã«ããããããæ¡åŒµåããã¿ãããã
.class
ã«çœ®ãæã
$(JAVA_CLASSPATH)
ãååŸããå¿ èŠãããã¯ã©ã¹ãã¡ã€ã«ã®ååãååŸããŸããã¿ãŒã²ããåããã¡ã€ã«
.cpp
ãšã«ãåãããšãè¡ããŸã
.o
ãããã«makefileã«ã¯ã次ã®ãã«ãã«ãŒã«ããããŸãã
$(JAVA_CLASSPATH)/%.class: $(JAVA_SOURCE_PATH)/%.java @echo $(PLATFORM_GENERAL_INCLUDES) if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi "$(JAVA_HOME)/bin/javac" -sourcepath "$(JAVA_SOURCE_PATH)" -classpath "$(JAVA_CLASSPATH)" -d "$(JAVA_CLASSPATH)" $< $(OBJ)/%.o: $(SRC)/cpp/%.cpp @echo $(PLATFORM_GENERAL_INCLUDES) mkdir -p $(OBJ) g++ $(DEBUG_OPTIMIZE) -D_JNI_IMPLEMENTATION_ -c $(PLATFORM_GENERAL_INCLUDES) $< -o $@
ãããã®ã«ãŒã«ã¯ããœãŒã¹ãã¡ã€ã«ãã¿ãŒã²ããã«ã³ã³ãã€ã«ããæ¹æ³ã説æããŠããŸãããããŠæåŸã«ãã¿ãŒã²ãããèŠãŠã¿ãŸããã
$(BIN)/crossbase: $(JAVA_CLASSES) $(CPP_OBJECTS) ...
ããã§ã¯ãèŠã€ãã£ããã¹ãŠã®ãã¡ã€ã«ãžã®äŸåé¢ä¿ã確èªããŸããã€ãŸããmakefileã¯ãæäŸããããã¹ãŠã®javaããã³cppãã¡ã€ã«ãæ£ãããã©ã«ããŒã«åéããããã«äœæãããŸãã
ãã®ä»ã®éèŠãªç¹ïŒ
-
-static-libgcc
ãããŠããããã¯-static-libstdc++
mingwã§å¿ èŠã§ãããã¢ã»ã³ãã«ããããã¡ã€ã«ã«ã¯æšæºCããã³C ++ã©ã€ãã©ãªãå«ãŸããŸãããã以å€ã®å Žåã¯ãåçã«ãªã³ã¯ãããããã€ãã®DLLããã©ãã°ããå¿ èŠããããŸãã -
-mconsole
ã·ã¹ãã ãèµ·åæã«ã³ã³ãœãŒã«å ¥å/åºåãçºè¡ããããã«ãWindowsã·ã¹ãã ã§å¿ èŠã§ããGUIã¢ããªã±ãŒã·ã§ã³ã®ãã®ãã©ã¡ãŒã¿ãŒã¯åé€ããå¿ èŠããããŸãã -rdynamic
ãã©ãããã©ãŒã ã®æ©èœã®ããããã®ãªãã·ã§ã³ã¯Windowsã®gccã§ã¯ãµããŒããããŠããŸããã
ã¢ã»ã³ããªèŠåã®ã«ãžã¥ã¢ã«ãªèŠåãèŠãŠã¿ãŸããã-
$(BIN)/crossbase: $(JAVA_CLASSES) $(CPP_OBJECTS)
ãæåã«ãlibavian.aãããã¹ãŠã®ãªããžã§ã¯ããã¡ã€ã«ã解åããååã§ãªã³ã«ãŒã«è»¢éããŸããåäœã¯å¥åŠã§ãããç¡æå³ã§ã¯ãããŸããã Windowsã§ã¯ãããã«ããäœããã®å¥åŠãªãªã³ã¯ã®åé¡ã解決ãããŸãïŒååã«ç解ã§ããŸããã§ããïŒã次ã«ãclasspath.jarãååŸããã³ã³ãã€ã«æžã¿ã®ã¯ã©ã¹ãbin / javaããè¿œå ããŠããã¹ãŠãbin / boot.jarã«ãŸãšããŸãã次ã«ãbinaryToObjectãåŒã³åºããŸããããã¯ãã·ã³ãã«_binary_boot_jar_startããã³_binary_boot_jar_endïŒmain.oã«ã€ã³ããŒãããïŒã䜿çšããŠboot.jarããobj / boot.jar.oãªããžã§ã¯ããã¡ã€ã«ãäœæããŸãããããŠæåŸã«ããã®äžåèªããã¹ãŠçµã³ä»ããŸãããããŠæåŸã«ãããžãã¯ã¹ããªããã³ãã³ããå®è¡ããŸãããã®ãã©ã¡ãŒã¿ãŒã§ã¯ãä»åã¯OS XãMinGWãLinuxãšã¯ç°ãªãç¬èªã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠããŸãããã®ã³ãã³ãã®ç®çã¯ãå®è¡å¯èœãã¡ã€ã«ããå·Šã®æåãæšãŠãããšã§ããéçºåã¯ãã¯ãã¹ããŒã¹ã®ééã¯9ã¡ã¬ãã€ããè¶ ããŠããŸããã1.5æªæºã§ããã
3.åå©ã®ç¬é
crossbase / binãã©ã«ããŒã«å ¥ã£ãããã³ã³ãœãŒã«ããã¯ãã¹ããŒã¹ãå®è¡ãããã©ã¡ãŒã¿ãŒãæž¡ããŸãã
> ./crossbase ! This is a crossplatform monolith application with Java code inside. Freedom to Java apps! args[0] = args[1] = !
çµæã®ãããžã§ã¯ãã¯ç§ã®GitHubã«ãããŸãã
4.çµæãšæå³
ãã®èšäºã®å©ç¹ãè©äŸ¡ããããšã¯é£ãããšæããŸããå°ãªããšãç§ã圌女ã«æåŸ ããããªããããã¯åœŒå¥³ãå°ãªããšãé¢çœããªããšããããšãæå³ããŸããè€éããã«èŠããã ãã§ããã®æ¹æ³ã¯ãããšãã°çŽç²ãªC ++ã§ããã°ã©ã ãäœæããã®ã«æ¯ã¹ãŠãååã«ææãäžããŠãããšèšããŸãããããžã§ã¯ããå°ãªããšãæ°åã®ã¯ã©ã¹ã«æé·ãããšãJavaã¯éåžžã«äŸ¿å©ã«ãªããŸãã C ++ã§ã³ãŒããæžããšãã«éåžžã«æ³šæãæã£ãŠãããšã©ãŒããã£ããããã®ãéåžžã«é£ããããã®æãç©Žãæ®ã£ãŠããŸãããããã£ãŠãJavaã§å¶åŸ¡ã³ãŒãïŒè¶ é«æ§èœãå¿ èŠãšããªãïŒãäœæããããšããã¹ãŠã®äººã«å§ããŸããæé«é床ãå¿ èŠãšããã³ãŒãã¯C ++ã§èšè¿°ã§ããC ++ Javaã¯ã©ã¹ãã¯ã©ã¹ã§ã©ããããã®ã¯éåžžã«ç°¡åã§ãããã§ãããã¶ããç§ã¯ãããçŸããããæ¹æ³ãæžããŠãçæã«ã¶ã€ãããªãããã«ããŸãã
åœåããã®ããµã³ãã€ãããã«ã¯ãã¹ãã©ãããã©ãŒã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹SWTïŒEclipseã§äœ¿çšãããïŒãè¿œå ããããšã«å°å¿µããèšäºã®ç« ãäœæããããšãèšç»ããŠããŸããããé·ãããŠéããããšå€æããŸããã玳士ãèå³ã®ããèªè ã§ããå Žåãç§ã¯ããã«ã€ããŠå¥ã«æžããŸãããæž èŽããããšãããããŸããïŒ
PS
ããããã¹ã¯åžæ°ããå€ãã®ã¬ãã¥ãŒãåããŠãèšäºãšããã°ã©ã ãå®æãããŸãããã¢ããã€ã¹ãšèšæ£ãããŠãããã¿ããªã«æè¬ããŸãã