From 1d125225bf0257dcfcf415f94eb46e07daee2dbf Mon Sep 17 00:00:00 2001 From: Harald Steinlechner Date: Thu, 23 Aug 2012 20:44:21 +0200 Subject: [PATCH] experiments with JNI; --- Makefile | 5 +++++ Mate/MethodPool.hs | 7 ++++++- Mate/Rts.hs | 5 +++++ jmate/lang/MateRuntime.java | 5 +++-- jmate/lang/Runtime.java | 17 +++++++++++++++++ rts/mock/jmate_lang_MateRuntime.c | 9 +++++++++ rts/mock/jmate_lang_MateRuntime.h | 21 +++++++++++++++++++++ rts/mock/jmate_lang_MateRuntime.h.gch | Bin 0 -> 167 bytes rts/mock/libMateRuntime.so | Bin 0 -> 6712 bytes tests/Garbage1.java | 12 ++++++++++-- tools/openjdktest.sh | 2 +- 11 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 Mate/Rts.hs create mode 100644 jmate/lang/Runtime.java create mode 100644 rts/mock/jmate_lang_MateRuntime.c create mode 100644 rts/mock/jmate_lang_MateRuntime.h create mode 100644 rts/mock/jmate_lang_MateRuntime.h.gch create mode 100755 rts/mock/libMateRuntime.so diff --git a/Makefile b/Makefile index b0a440d..0468502 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,11 @@ COMPILEF = $(basename $@).compile ffi/native.o: ffi/native.c ghc -Wall -O2 -c $< -o $@ +runtime: jmate/lang/MateRuntime.java + javac jmate/lang/MateRuntime.java + javah -o rts/mock/jmate_lang_MateRuntime.h jmate.lang.MateRuntime + gcc -shared -fPIC -I$(JAVA_HOME)/include rts/mock/jmate_lang_MateRuntime.c -I./rts/mock -o rts/mock/libMateRuntime.so + GHCCALL = ghc --make $(GHC_OPT) Mate.hs ffi/trap.c -o $@ $(GHC_LD) -outputdir mate: Mate.hs ffi/trap.c $(HS_FILES) $(HS_BOOT) ffi/native.o $(CLASS_FILES) @mkdir -p $(B_RELEASE) diff --git a/Mate/MethodPool.hs b/Mate/MethodPool.hs index da3e5e0..4be3cf2 100644 --- a/Mate/MethodPool.hs +++ b/Mate/MethodPool.hs @@ -32,7 +32,7 @@ import Mate.NativeMachine import Mate.ClassPool import Mate.Debug import Mate.Utilities -import Mate.GarbageAlloc +import Mate.Rts() foreign import ccall "dynamic" code_void :: FunPtr (IO ()) -> IO () @@ -43,6 +43,9 @@ foreign import ccall "&demoInterfaceCall" foreign import ccall "&printMemoryUsage" printMemoryUsageAddr :: FunPtr (IO ()) +foreign import ccall "&loadLibrary" + loadLibraryAddr :: FunPtr (IO ()) + getMethodEntry :: CPtrdiff -> CPtrdiff -> IO CPtrdiff getMethodEntry signal_from methodtable = do mmap <- getMethodMap @@ -74,6 +77,8 @@ getMethodEntry signal_from methodtable = do let scm = toString cm; smethod = toString method if scm == "jmate/lang/MateRuntime" then do case smethod of + "loadLibrary" -> + return . funPtrToAddr $ loadLibraryAddr "demoInterfaceCall" -> return . funPtrToAddr $ demoInterfaceCallAddr "printMemoryUsage" -> diff --git a/Mate/Rts.hs b/Mate/Rts.hs new file mode 100644 index 0000000..844b44a --- /dev/null +++ b/Mate/Rts.hs @@ -0,0 +1,5 @@ +module Mate.Rts (loadLibrary) where + +foreign export ccall loadLibrary :: IO () +loadLibrary :: IO () +loadLibrary = print "load lib" diff --git a/jmate/lang/MateRuntime.java b/jmate/lang/MateRuntime.java index 56f3a10..678182b 100644 --- a/jmate/lang/MateRuntime.java +++ b/jmate/lang/MateRuntime.java @@ -1,6 +1,7 @@ package jmate.lang; public class MateRuntime { - public static native void demoInterfaceCall(int val); - public static native void printMemoryUsage(); + + public static native void loadLibrary(String lib); + public static native int getCurrentHeapSize(); } diff --git a/jmate/lang/Runtime.java b/jmate/lang/Runtime.java new file mode 100644 index 0000000..d15200a --- /dev/null +++ b/jmate/lang/Runtime.java @@ -0,0 +1,17 @@ +package jmate.lang; + +public class Runtime +{ + public Runtime() + { + } + + public void loadLibrary(String name) + { + } + + public static Runtime getRuntime() + { + return new Runtime(); + } +} diff --git a/rts/mock/jmate_lang_MateRuntime.c b/rts/mock/jmate_lang_MateRuntime.c new file mode 100644 index 0000000..4b8a171 --- /dev/null +++ b/rts/mock/jmate_lang_MateRuntime.c @@ -0,0 +1,9 @@ +#include "jmate_lang_MateRuntime.h" + +JNIEXPORT jint JNICALL Java_jmate_lang_MateRuntime_getCurrentHeapSize + (JNIEnv *env, jclass class) +{ + return 0; +} + + diff --git a/rts/mock/jmate_lang_MateRuntime.h b/rts/mock/jmate_lang_MateRuntime.h new file mode 100644 index 0000000..991b5e8 --- /dev/null +++ b/rts/mock/jmate_lang_MateRuntime.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class jmate_lang_MateRuntime */ + +#ifndef _Included_jmate_lang_MateRuntime +#define _Included_jmate_lang_MateRuntime +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: jmate_lang_MateRuntime + * Method: getCurrentHeapSize + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_jmate_lang_MateRuntime_getCurrentHeapSize + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/rts/mock/jmate_lang_MateRuntime.h.gch b/rts/mock/jmate_lang_MateRuntime.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..32d8c1d9aefa915adcdb141edcbea655c3f96469 GIT binary patch literal 167 zcmYcb= zT``cgk$^Ei6AecGAkowqjs7UvYK*^##z$f_3Tjqu5F-+zhV}c-*;8({#_-#nW_IQ~ zGv{&V%zd2co|g7jkH;f4d4*RH?ez+=6w-f{vMdz=afPT8^TZr!*Z!1&$%-L_s20-h zpMk#f6<=UG2Axu}PlBw2y$*KrFff^RUy1$j*IbJ>vbJsd&I!K^pt%M%vbNt1JK#S^ zkKX~idwrwuB(p!Sozf3R2t?b4Eu#LJhmV^_Pfh*e{Nm8EUuT`#H`3_PMn7H)$NfMA z7Ko9?sca*z05`XMGWyQxL%TnJXlu>egTGY$`0>wGFTAwmQJBUN*RE+H6s|#20Lo1o zKoa+ZE2)60#V^Giq(4BU@E%CF9a|#&Trg;+m@2M;+|PxAW{OI&3UVdzl@d=A!Zds0 z$%L79tdwJ#!i*-Ojxf6+U<&nHRIONamo3b7eP)N<6HPmIDj2iUX*(^}S$&qdBW^ji z8M6{S=6YxynS>LK+h&jL1T(3Wop9FJR&OVVh()_XMmlNK3)2o;j)f_@(rGn0ni65r z*1onmXf81p8@FMFj5uR7{x5+xUMDF%KRT6u2Ne_*0kt0mcW=W2Awj#O;R)A14&hZxx65$->! zc%%})5vo6YjZun6xXK94Kb!>Ia^SmrIt#A?4&--WuIy;_-go8zip=(0_MDoxDwkzG z9`Mx`j-e%&WyTB+-3)#3a27n{8Kb!jg z{Va#~WJjvE-M>AL`8x{+8V2$|&Exd`+~Gy=-}jL-E0_I~+ORWiP_`ZL*A`D^NBrBi z=W{i+`Ge^D7U$ZYKR8C}dcH)zf&8-=FqaKLM*y8`2ZyK*zHuG+iB;!Kz?CKDn-4&jBl|J8oY)t@dj8ZTB z7eR`uiq@*ibu*?pzJ9T4?ur|i)GnmG5!`^WnERrss$$=y=IN7LG01ytC{sBCw)30_6ylBT$aO{~-eS94zuWwWN+uO2IP*zvg+Cnhwb`)NdDy$p#pC_Vwcfm1jQ( znBSAngK?UY=Mo+>&f&blZ&;oH_}$8*^=z;YM(W?fI1@4ez8cI!0zO}pBWTB3l3c@C z$k%{>FJUxYHu21@sT*_mfq6!13kL59)NSd)SuJyGJC1m%WMHXLZ!ErLc}6zgc7wt~ z80npH$LfM~Qc6a&mPk6b(UZs+U72Vsd`mPeB#Kz+h%mxC6X>a=lTwyGJC%+m6XSph zTgr~nUn#vYM;P)PYB+X3ba@&z?14+_OygHBl;@&e?$Sa{UCrI=o zH-MQh^kWW@UxZE@R4JJ|jbQerA9Ie(T+>8f(i$-HhJMT$GV@N)%Xab>F!PK$bB!E; z?w%J=guysi%RbCiasXJ5M}OvQ9IXAA+hnere!MTVUmtX?mG=zqDKcZFiGHMqz}jyU ze8}=lC#`C1`tEl5?S&7yf*ni5HIN+yIGljll{`qA_5FZtmz$JLs&tM+@!Z%z0(a z4SvJWwVjgdco(eaWv!$DKR)j?(T{urto`^*I|n~~4yUj7`_SblYcSXV+B9kXBpNtB z*T=e5CHy9e%O|jN-bG*%{ccpM{H2Y|XDP?hR1d$eG=QWJiIRJ(seP6Zjp)c+xCzYl zp{vYg_jr$^7;#Jw0=r8E8c%#KkW^Jw-TMlwnR$;ZtY+Z7tgwm>?^%WUhEeyX!rW1H z4=T(j5!PHl>4lErb#TcGrnhE_(p>0boBB5XXBA z*ggKCzxlsH|5ChJmlmOvlXf!Q-9`vS;Na$s9cKI5&dsbqo2$p6bwQUYoHTo4$u28q z%GbSVW%>nP<-IZ6vBO6FqK0}wgBcC?6Ez6+#SqTK<2&^{EgM$LX<9p)*0-1%aT={( znniwF$XO;Xa?906>l^9~RJ+aIkm*D+i3g3Yetj8ZL#C5v#7cx?sH3mGcSF0YBx8wwsy8`Ha9mlx3}Q>OO^2nO7M-1?(+C$*53bK=x4QkT={*1^1k|Sz+bDR BrwRZ7 literal 0 HcmV?d00001 diff --git a/tests/Garbage1.java b/tests/Garbage1.java index 5ffea7b..4073cc8 100644 --- a/tests/Garbage1.java +++ b/tests/Garbage1.java @@ -4,7 +4,15 @@ package tests; public class Garbage1 { - + static + { + loadLibrary(); + } + + public static void loadLibrary() + { + //Runtime.getRuntime().loadLibrary("MateRuntime"); + } public Garbage1(){} @@ -33,7 +41,7 @@ class Big2 public Big2() { - arr = new int[0x400]; + arr = new int[0xF400]; //System.out.println("foo"); } diff --git a/tools/openjdktest.sh b/tools/openjdktest.sh index 605928d..e077572 100755 --- a/tools/openjdktest.sh +++ b/tools/openjdktest.sh @@ -8,7 +8,7 @@ fi class2test=$1 -openjdk="java -client" +openjdk="java -client -Djava.library.path=rts/mock" openjdk_output=`mktemp` mate="./mate" mate_output=`mktemp` -- 2.25.1